我有一些日期数据如下: -
Person | Date
1 | 1/1/2000
1 | 6/1/2000
1 | 11/1/2000
1 | 21/1/2000
1 | 28/1/2000
我需要在上一行的14天内删除行。但是,如果删除了一行,则不应该在以后成为基础'检查以后行的日期。它可能更容易显示所需的结果: -
Person | Date
1 | 1/1/2000
1 | 21/1/2000
我的感觉是需要递归SQL,但我不确定如何设置它。我将在Teradata上运行它。
感谢。
---编辑---
嗯,这很令人尴尬。事实证明这个问题之前已经被问过了 - 我被问到了!请参阅这个老问题,以获得@dnoeth的精彩答案: -答案 0 :(得分:1)
使用递归表。使用ROWNUMBER()对日期进行排序和编号。
DATEDIFF()接收自上次日期过去的天数
也许SQL2012及以上版本可以简化使用SUM()OVER PARTITION和RANGE 在这种情况下,我没有发现它有用
DECLARE @Tab TABLE ([MyDate] SMALLDATETIME)
INSERT INTO @Tab ([MyDate])
VALUES
('2000-01-06'),
('2000-01-01'),
('2000-01-11'),
('2000-01-21'),
('2000-01-28')
;
WITH DOrder (MyDate, SortID) AS (
SELECT MyDate,
ROW_NUMBER() OVER (ORDER BY MyDate)SortID
FROM @Tab t)
,Summarize(MyDate, SortID, sSum, rSum ) AS (
SELECT MyDate, SortID, 0, 0 rSum
FROM DOrder WHERE SortID = 1
UNION ALL
SELECT t.MyDate, t.SortID, DATEDIFF(D, ISNULL(s.MyDate,t.MyDate), t.MyDate) rSum,
CASE WHEN DATEDIFF(D, ISNULL(s.MyDate,t.MyDate), t.MyDate) + s.rSum>14 THEN 0
ELSE DATEDIFF(D, ISNULL(s.MyDate,t.MyDate), t.MyDate)
END rSum
FROM DOrder t INNER JOIN Summarize s
ON (t.SortID = s.SortID+1))
SELECT MyDate
FROM Summarize
WHERE rSum=0