如何在SQL Developer中筛选同一名称下日期差±1天的数据行
解决方案:按Name筛选同组内日期相差±1天的记录
嘿,针对你需要按Name分组,筛选出同一Name下Creation_Date处于±1天范围内行的需求,我整理了两种常用的SQL实现方法,都能达成你的目标:
方法一:自连接(Self Join)实现
这种方式通过把表和自己做连接,匹配相同Name且日期差在1天内的记录,逻辑直观易懂:
SELECT DISTINCT t1.Name, t1.Creation FROM your_table t1 JOIN your_table t2 ON t1.Name = t2.Name AND t1.Creation != t2.Creation AND ABS(DATEDIFF(day, t1.Creation, t2.Creation)) <= 1 ORDER BY t1.Name, t1.Creation;
关键细节解释:
DISTINCT:因为自连接会产生双向匹配(比如Sam的01/01/2020会和01/02/2020配对,反过来也会配对一次),用它避免重复输出同一行DATEDIFF(day, ...):计算两个日期的天数差,ABS取绝对值后判断是否≤1,确保覆盖前后1天的范围- 连接条件里的
t1.Creation != t2.Creation是为了排除同一行自己和自己匹配的情况
方法二:窗口函数(LAG/LEAD)实现
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),这种方法效率更高,逻辑也清晰:
WITH date_neighbors AS ( SELECT Name, Creation, -- 获取同组内上一条记录的日期 LAG(Creation) OVER (PARTITION BY Name ORDER BY Creation) AS prev_creation, -- 获取同组内下一条记录的日期 LEAD(Creation) OVER (PARTITION BY Name ORDER BY Creation) AS next_creation FROM your_table ) SELECT Name, Creation FROM date_neighbors WHERE -- 当前日期和上一条的差≤1天 (prev_creation IS NOT NULL AND ABS(DATEDIFF(day, Creation, prev_creation)) <= 1) -- 或者当前日期和下一条的差≤1天 OR (next_creation IS NOT NULL AND ABS(DATEDIFF(day, Creation, next_creation)) <= 1) ORDER BY Name, Creation;
关键细节解释:
PARTITION BY Name:把数据按Name分组,确保只在同一Name内比较日期LAG和LEAD:分别拿到当前行的上一个和下一个日期,这样就能判断当前日期是否和相邻日期在±1天内- 加了
prev_creation IS NOT NULL和next_creation IS NOT NULL是为了避免每组第一条/最后一条记录的空值判断报错
关于输出的小说明
按照你描述的逻辑,Jack的10/21/2018和他的其他日期差都远超过1天,所以不会被筛选出来。最终输出应该是:
Name, Creation
Sam, 01/01/2020
Sam, 01/02/2020
Jack, 12/30/2019
Jack, 12/31/2019
这刚好是4行,和你说的总数一致,应该是你期望输出里的笔误啦~
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

