使用SQL删除浮动数据范围内的行

时间:2015-11-19 08:52:46

标签: sql date teradata

我有一些日期数据如下: -

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的精彩答案: -

Drop rows identified within moving time window

1 个答案:

答案 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