如何比较日期时间 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 |
+------------+
这是我目前的 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 |
+------------+