2013-07-23 4 views
0

Я использую SQL Server 2008, и мне нужна помощь в написании запроса, который сравнивает две последовательные записи.Попытка сравнить две последовательные записи

select recordDate 
from SiteHistory 
where siteId = 556145 
    and isRecent = 0 
    and isRunning = 1 
order by 
    recordDate DESC 

дает мне около 2000 строк, выглядит следующим образом:

recordDate 
----------------------- 
2013-05-08 20:04:23.357 
2013-05-08 19:45:26.417 
2013-05-08 19:30:24.810 
2013-05-08 19:17:22.843 
2013-05-08 19:00:16.017 
2013-05-08 18:44:14.230 
..... 
..... 

Теперь мне нужно сравнить дату каждой строки со следующей строкой и подсчитать, сколько раз разницы между двумя последовательными датами более 15 минут. Это то, что я мог придумать до сих пор:

;with temp as(
select row_number()over(order by recordDate DESC)as 'row', recordDate 
from SiteHistory 
where siteId = 556145 and isRecent =0 and isRunning=1 
) 

select COUNT(*) as Count from temp t1 
INNER JOIN temp t2 ON t2.row = t1.row+1 
where DATEDIFF(mm,t1.recordDate,t2.recordDate)>15 

Однако это не дает мне желаемого. Пожалуйста, дайте мне знать, как я могу исправить это в соответствии с моими требованиями.

+1

Каков реальный выход? Кроме того, имеет ли SQL Server функцию 'lag()' window? –

+2

Какая версия SQL Server? И каким образом вы не получаете ожидаемых результатов? Покажите конкретные примеры, демонстрирующие требуемые угловые случаи. – MatBailie

+0

Как я уже упоминал, я использую SQL Server 2008. Если вы посмотрите на записи, по крайней мере несколько записей, где разница между последовательными временами больше 15 минут. Поэтому я ожидаю подсчет, который по крайней мере больше 1, но я получаю счет 0. И, насколько мне известно, я не думаю, что SQL-сервер имеет функцию lag(). –

ответ

2

Логика запроса правильно, единственное, что ее пытаются получить разницу в дате в месяц изменить его на минуты в

datediff(minute, t1.RecordDate, t2.RecordDate) > 15 

Запрос:

;with temp as(
    select row_number()over(order by recordDate DESC)as 'row', recordDate 
    from SiteHistory 
    where siteId = 556145 and isRecent = 0 and isRunning = 1 
) 
    select COUNT(*) as Count from temp t1 
    INNER JOIN temp t2 ON t2.row = t1.row+1 
    where DATEDIFF(minute, t1.recordDate, t2.recordDate) > 15 
+0

Вы избили меня до 12 секунд! LOL –

+0

Это были фактически тестовые данные. В конечном итоге я должен изменить его на часы (ЧЧ). Я был так занят, пытаясь понять логику, что я не обращаю внимания на эту крошечную деталь. Спасибо. –

2

«мм» дает разницу даты в месяцев

where DATEDIFF(mm,t1.recordDate,t2.recordDate)>15 

Заменить «мм» с «минуты»

where DATEDIFF(minute,t1.recordDate,t2.recordDate)>15 
+0

Sheesh! Спасибо огромное! –

1

Может быть, это так просто, как это:

where ABS(DATEDIFF(minute,t1.recordDate,t2.recordDate))>15 
+0

Да. Я был так потерян, что положил в мм вместо минуты. Спасибо. –

Смежные вопросы