小编典典

如何获取不在30天内的下一个最小日期并将其用作SQL中的参考点?

sql

我有一个记录的子集,看起来像这样:

ID DATE
A  2015-09-01
A  2015-10-03
A  2015-10-10
B  2015-09-01
B  2015-09-10
B  2015-10-03
...

对于每个ID,第一个最小日期是第一个索引记录。现在,我需要排除索引记录30天内的案例,任何日期大于30天的记录都将成为另一个索引记录。

例如,对于ID
A,2015-09-01和2015-10-03都是索引记录,由于相隔30天以上,因此将被保留。2015年10月10日将被删除,因为它距离第二个索引案例的30天之内。

对于ID
B,由于它位于第一条索引记录的30天内,因此将删除2015-09-10并将其不作为索引案例。2015-10-03将被保留,因为它距离第一索引记录的时间超过30天,将被视为第二索引情况。

输出应如下所示:

ID DATE
A  2015-09-01
A  2015-10-03
B  2015-09-01
B  2015-10-03

如何在SQL Server 2012中做到这一点?ID可以有多少个日期没有限制,可以是1到5个或更多。我对SQL相当基本,因此任何帮助将不胜感激。


阅读 148

收藏
2021-04-07

共1个答案

小编典典

就像您的示例一样,#test是您的数据表:

;with cte1
as
(
    select 
        ID, Date, 
        row_number()over(partition by ID order by Date) groupID
    from #test
),
cte2
as
(
    select ID, Date, Date as DateTmp, groupID, 1 as getRow from cte1 where groupID=1
    union all
    select 
        c1.ID, 
        c1.Date, 
        case when datediff(Day, c2.DateTmp, c1.Date) > 30 then c1.Date else c2.DateTmp end as DateTmp,
        c1.groupID, 
        case when datediff(Day, c2.DateTmp, c1.Date) > 30 then 1 else 0 end as getRow
    from cte1 c1
    inner join cte2 c2 on c2.groupID+1=c1.groupID and c2.ID=c1.ID
)
select ID, Date from cte2 where getRow=1 order by ID, Date
2021-04-07