SQL Server:查找存在前后日期重复ID的记录
解决重复ID且日期差1天的记录查询问题
嘿,我完全懂你的痛点——要筛选出ID重复、且日期刚好是前一天或后一天的记录,之前嵌套子查询的写法确实太绕了。其实用**自连接(Self-Join)**就能轻松搞定,逻辑清晰还简洁!
简化版SQL语句
直接用自连接关联同一张表,就能精准匹配你要的条件:
SELECT DISTINCT t1.* FROM your_table t1 INNER JOIN your_table t2 ON t1.ID = t2.ID AND t1.[DATE] != t2.[DATE] AND ABS(DATEDIFF(day, t1.[DATE], t2.[DATE])) = 1;
语句逻辑解释
- 自连接:把表
t1和自身的t2关联,相当于把同一张表当成两个独立的数据集来对比 t1.ID = t2.ID:确保只对比同一个ID的记录t1.[DATE] != t2.[DATE]:排除掉同一天的重复记录(如果你的表存在同一天同一ID的情况)ABS(DATEDIFF(day, t1.[DATE], t2.[DATE])) = 1:用DATEDIFF计算两个日期的天数差,加绝对值确保不管是前一天还是后一天,差值都是1DISTINCT:避免因为双向匹配(比如t1是2024-05-20,t2是2024-05-21;反过来t1是2024-05-21,t2是2024-05-20)导致的重复结果
可选优化:查看配对记录
如果你想同时看到每一组配对的两条记录(方便直接对比日期),可以去掉DISTINCT,改成显示两个日期字段:
SELECT t1.ID, t1.[DATE] AS record_date, t2.[DATE] AS adjacent_date FROM your_table t1 INNER JOIN your_table t2 ON t1.ID = t2.ID AND t1.[DATE] != t2.[DATE] AND ABS(DATEDIFF(day, t1.[DATE], t2.[DATE])) = 1;
这个方法比嵌套子查询更直观,维护起来也简单,而且大部分数据库对自连接的查询优化都做得不错,性能也有保障。
内容的提问来源于stack exchange,提问作者Davey Jones
相关产品推荐
相关产品推荐

