You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:42:45