如何比较日期时间 NextRow 与 SQL 中的 CurrentRow 并找出 X 天数的差异?

How to compare datetime NextRow with CurrentRow in SQL and find a difference in X amount of days?

这是我目前的 table 结构 (MS SQL 10):

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 列表,其中条目日期之间的 activity(评论)相隔超过 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 早于 x 天的位置。 DaysDiff 列会告诉我行之间存在多少天,但我似乎无法为此添加 WHERE 子句以指定 > 7 天。 (WHERE DaysDiff > 7) 例如

创建样本table:

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