2015-08-31 2 views
0

Это моя текущая структура таблицы (MS SQL 10):Как сравнить datetime NextRow с CurrentRow в SQL и найти разницу в Х количество дней?

CaseNo  EntryDate     Comment 
0000000001  2013-10-10 12:00:00.000  This is a test comment 
0000000001  2013-10-21 18:00:00.000  This is a test comment 
0000000002  2013-10-10 12:00:00.000  This is a test comment 
0000000003  2013-11-07 12:00:00.000  This is a test comment 
0000000003  2013-12-01 02:00:00.000  This is a test comment 
0000000003  2013-12-01 09:00:00.000  This is a test comment 
0000000004  2013-10-10 12:00:00.000  This is a test comment 

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

CaseNo 
0000000001 
0000000003 

То, что я ищу, чтобы получить список CaseNos где активность (комментарий) между датами входа составляет более 7 дней (достаточно одного экземпляра).

Это где я в настоящее время (взято из Date Difference between consecutive rows):

SELECT T1.CaseNo, 
    T1.Operator, 
    T1.EntryDate, 
    MIN(T2.EntryDate) AS NextDate, 
    DATEDIFF("D", T1.EntryDate, MIN(T2.EntryDate)) AS DaysDiff 
FROM CaseCorrespondence T1 
    LEFT JOIN Cases T2 
     ON T1.CaseNo = T2.CaseNo 
     AND T2.EntryDate > T1.EntryDate 
GROUP BY T1.CaseNo, T1.Operator, T1.EntryDate 
ORDER BY T1.CaseNo; 

Проблема с этим запросом является то, что я не в настоящее время вычисления где T1.EntryDate старше х дней. Столбец DaysDiff сообщит мне, сколько дней существует между строками, но я не могу добавить предложение WHERE, чтобы указать> 7 дней. (WHERE DaysDiff> 7), например

+0

Поскольку вы сравниваете даты, было бы полезно узнать, какую базу данных вы используете. – FutbolFan

+0

Похоже, что вы используете 'SQL Server 2008', так что, к сожалению, вы не сможете воспользоваться новыми аналитическими функциями, такими как' Lead' и 'Lag', которые были введены в' SQL Server 2012'. Но вместо этого вы можете использовать 'row_number', чтобы делать то, что вам нужно. – FutbolFan

ответ

1

Создать образец таблицы:

create table cases (CaseNo varchar(50), EntryDate datetime, Comment varchar(255)); 

insert into cases values 
('0000000001', '2013-10-10 12:00:00.000', 'This is a test comment'), 
('0000000001', '2013-10-21 18:00:00.000', 'This is a test comment'), 
('0000000002', '2013-10-10 12:00:00.000', 'This is a test comment'), 
('0000000003', '2013-11-07 12:00:00.000', 'This is a test comment'), 
('0000000003', '2013-12-01 02:00:00.000', 'This is a test comment'), 
('0000000003', '2013-12-01 09:00:00.000', 'This is a test comment'), 
('0000000004', '2013-10-10 12:00:00.000', 'This is a test comment'); 

Вы можете использовать ROW_NUMBER() сделать это:

;WITH q1 
AS (
    SELECT row_number() OVER (
      PARTITION BY caseno ORDER BY caseno 
       ,entrydate 
      ) AS rn 
     ,c.* 
    FROM cases c 
    ) 
SELECT q1.caseno 
FROM q1 
INNER JOIN q1 q2 ON q1.caseno = q2.caseno 
    AND q1.rn = q2.rn + 1 
WHERE datediff(day, q2.entrydate, q1.entrydate) > 7 

Результат:

+------------+ 
| caseno | 
+------------+ 
| 0000000001 | 
| 0000000003 | 
+------------+ 

SQL Fiddle Demo

+0

Это замечательно, спасибо. –

+0

Удивительный! Пожалуйста, закройте этот вопрос, отметив его как принятый ответ. Благодаря! – FutbolFan