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

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相当基本,因此任何帮助将不胜感激。

最佳答案

就像您的示例一样,#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

关于sql - 如何获取不在30天内的下一个最小日期并将其用作SQL中的引用点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36805651/

10-14 15:02