如何过滤SQL日期重叠自连接查询中的重复配对结果?
解决日期重叠查询中的重复配对问题
哈哈,这个重复配对的坑我之前写日期重叠查询的时候也踩过!其实只要给你的自连接加个简单的排序限制就能轻松搞定~
先回顾下你的场景
原始数据表
| Col1 | Startdate | Enddate |
|---|---|---|
| A | D1 | D14 |
| B | D5 | D18 |
| C | D20 | D24 |
| D | D30 | D40 |
你原本的查询语句
select t1.col1, t2.col1 from table t1, same_table t2 where t1.col1!= t2.col1 and t1.startdate <= t2.enddate and t1.enddate >= t2.startdate;
遇到的问题:出现反向重复配对
| Table1.Col1 | Table2.col1 |
|---|---|
| A | B |
| B | A |
解决方案:给配对加固定排序约束
问题的根源在于自连接时,t1和t2会互相匹配(A匹配B,B也匹配A)。我们只需要强制让配对中的两个Col1保持一个固定的顺序,就能避免反向重复。
修改后的SQL语句(顺便把隐式连接改成更规范的显式JOIN写法):
select t1.col1, t2.col1 from table t1 join same_table t2 on t1.col1 < t2.col1 -- 关键:用小于关系代替不等于,确保配对唯一 and t1.startdate <= t2.enddate and t1.enddate >= t2.startdate;
逻辑解释
t1.col1 < t2.col1:这个条件强制每个配对中,t1的Col1在字符串(或对应类型)排序上比t2的小,这样只会保留A|B这类正向配对,不会出现B|A的反向重复- 日期重叠的判断条件保持不变,确保我们只筛选出真正有日期交集的记录
- 如果你的Col1是数字类型,这个
<逻辑同样适用,只要该类型支持比较运算就行
内容的提问来源于stack exchange,提问作者U12
相关产品推荐
相关产品推荐

