Получить набор диапазонов дат / времени на основе данных БД - PullRequest
0 голосов
/ 12 октября 2009

У меня есть БД SQL 2005, полная записей о действиях, которые включают столбец DateTime, DeviceID и различные биты данных. Мне нужен запрос, который даст мне список диапазонов дат / времени на основе DeviceID (возможно, ограниченный временем начала / окончания). Кроме того, я бы посчитал, что новый диапазон начинается как минимум через 60 минут после окончания старого (если он меньше 60 минут, то это часть старого диапазона).

Пример данных:

DateTime                 DeviceID
2009-10-11 12:01:30      Dev1
2009-10-11 12:02:30      Dev1
2009-10-11 12:03:21      Dev1
2009-10-11 12:04:30      Dev1
2009-10-11 12:05:45      Dev1
2009-10-11 12:06:10      Dev1
2009-10-11 12:07:40      Dev1
2009-10-11 12:08:20      Dev1
2009-10-11 13:30:11      Dev1
2009-10-11 13:32:21      Dev1
2009-10-11 13:36:45      Dev1
2009-10-11 13:39:16      Dev1
2009-10-11 13:42:18      Dev1
2009-10-11 13:46:22      Dev1
2009-10-11 13:48:35      Dev1

Ожидаемые результаты:

StartDate                EndDate
2009-10-11 12:01:30      2009-10-11 12:08:20
2009-10-11 13:30:11      2009-10-11 13:48:35

1 Ответ

0 голосов
/ 12 октября 2009

Прочтите что-нибудь о ROW_NUMBER ()

Тогда посмотрите на этот запрос:

SELECT <br>
&nbsp;&nbsp;  DeviceID,<br>
&nbsp;&nbsp;  "DateTime",<br>
&nbsp;&nbsp;  ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName

Then look at this query:

WITH DateTable <br>
AS<br>
(SELECT <br>
&nbsp;&nbsp;  DeviceID,<br>
 &nbsp;&nbsp; "DateTime",<br>
&nbsp;&nbsp;  ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName)<br>
SELECT <br>
&nbsp;&nbsp;  D1.DeviceID,<br>
&nbsp;&nbsp;  D1."DateTime" EndDate,<br>
&nbsp;&nbsp;  D2."DateTime" StartDate<br>
FROM DateTable D1<br>
JOIN DateTable D2<br>
ON (D1.DeviceID = D2.DeviceID) <br>
&nbsp;&nbsp;  AND (D1.OrdinalNumber = D2.OrdinalNumber - 1) <br>
&nbsp;&nbsp;  AND (DATEDIFF(MINUTE,D1."DateTime",D2."DateTime") >= 60)<br>

Мы ищем разрывы с разницей более 60 минут.

Теперь вы должны взять StartDate из каждого ряда и сопоставить его с EndDate из следующего. Так как это 4 утра, я оставлю это вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...