Member 14760154 Ответов: 1

Sql select distinct на основе диапазона datetime


У меня есть данные в моей таблице, как это

001800081 2020-05-19 11:59:04.720
001800081 2020-05-19 12:01:51.997
001800081 2020-05-19 22:03:58.627
001800081 2020-05-19 22:04:03.190

Я хочу, чтобы результат sql-запроса был таким
001800081 2020-05-19 12:01:51.997
001800081 2020-05-19 22:03:58.627

Я хочу выбрать различные данные на основе времени диапазона ,
для каждого примера диапазона данных есть 1 час

первый ряд имеет 2-минутный Диапазон со вторым рядом ,
я хочу выбрать 1 из них в результате ,
Второй ряд имеет 10-часовой диапазон с третьим рядом ,поэтому я хочу выбрать оба ,
Третий ряд имеет 2 - минутный диапазон с четвертым рядом ,поэтому я хочу выбрать 1 из них ,

Я просто хочу выбрать одни данные для каждого диапазона данных datetime < 5 минут


Как я могу решить эту проблему?

Что я уже пробовал:

это мой вопрос ,

он еще не завершен

Select ROW_NUMBER() Over (Order by Timer_finger asc) as 'rownum' ,a.* from
T_Finger_Log a where CONVERT(Date,Insert_Date) = CONVERT(date,getdate())

1 Ответов

Рейтинг:
4

Maciej Los

Взгляните на это:
LEAD (Transact-SQL) - SQL Server | Microsoft Docs[^]
LAG (Transact-SQL) - SQL Server | Microsoft Docs[^]

Использование:

DECLARE @T_Finger_Log TABLE(Timer_finger VARCHAR(30), Insert_Date DATETIME)

INSERT INTO @T_Finger_Log (Timer_finger, Insert_Date)
VALUES('001800081', '2020-05-19 11:59:04.720'),
('001800081', '2020-05-19 12:01:51.997'),
('001800081', '2020-05-19 22:03:58.627'),
('001800081', '2020-05-19 22:04:03.190')


SELECT *
FROM
(
	SELECT *, DATEDIFF(N, Insert_Date, LEAD(Insert_Date) OVER(PARTITION BY Timer_finger ORDER BY Insert_Date)) MinutesPast 
	FROM @T_Finger_Log 
) T
WHERE T.MinutesPast<5

Результат:
Timer_finger	Insert_Date	MinutesPast (to next 'row')
001800081	2020-05-19 11:59:04.720	2
001800081	2020-05-19 22:03:58.627	1