我有一个记录子集,如下所示:
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,2015-09-10 将被删除,并且不会成为索引案例,因为它在第一个索引记录的 30 天内。 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)