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