MS SQL Server:提取行间CreatedDate间隔≥10天的ParentRef
解决MS SQL Server提取符合条件的ParentRef问题
嘿,我来帮你搞定这个需求!你需要找出那些同ParentRef组内存在相邻两行CreatedDate间隔≥10天的ParentRef,结合你的示例数据,我给你整理了一套实用的SQL方案:
思路拆解
- 按
PARENTREF分组,确保我们只在同一个父引用的记录范围内处理; - 使用窗口函数
LEAD()获取当前行的下一行CreatedDate,实现“当前行与下一行”的关联; - 计算两个日期的天数差,筛选出差值≥10的记录,最后去重得到目标
PARENTREF。
完整SQL代码
WITH RankedNotes AS ( SELECT PARENTREF, -- 将字符串格式的CREATEDDATE转为DATE类型(112对应yyyyMMdd格式) CONVERT(DATE, CREATEDDATE, 112) AS FormattedCreatedDate, -- 获取同组内下一行的格式化日期 LEAD(CONVERT(DATE, CREATEDDATE, 112)) OVER ( PARTITION BY PARENTREF ORDER BY CONVERT(DATE, CREATEDDATE, 112), CREATEDTIME ) AS NextFormattedCreatedDate FROM YourTableName -- 记得替换成你的实际表名 ) SELECT DISTINCT PARENTREF FROM RankedNotes WHERE NextFormattedCreatedDate IS NOT NULL -- 排除每组最后一行(无下一行可对比) AND DATEDIFF(DAY, FormattedCreatedDate, NextFormattedCreatedDate) >= 10;
代码细节说明
- CTE
RankedNotes:预处理数据,把字符串类型的日期转成可计算的DATE格式,同时用LEAD窗口函数关联同组的下一行日期; PARTITION BY PARENTREF:限定只在同一个ParentRef的记录组内查找下一行,避免跨组对比;ORDER BY:按日期+时间排序,保证“下一行”是时间逻辑上的后续记录;DISTINCT:避免同一个ParentRef因为多组相邻行满足条件而重复出现在结果中。
针对你的示例数据的预期结果
运行这段代码后,会返回以下PARENTREF:
- 2014297(2016-02-16 到 2016-03-17,间隔30天)
- 2019109(2015-06-08 到 2015-06-18,间隔10天)
- 2021908(2015-05-26 到 2015-06-11,间隔16天)
而2000363因为两行日期相同,间隔0天,不会被选中。
内容的提问来源于stack exchange,提问作者BuddyCool
相关产品推荐
相关产品推荐

