我有一个记录的子集,看起来像这样:
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