SQL实现:提取contract表同ID下END为9999-12-31的重复记录的最早Begin日期
优化方案
原SQL跑起来要么报错、要么漏数据、要么算得慢:
- 重复判断写死了count=2,要是某个ID下有3条END为9999-12-31的记录,直接就被滤掉了,不符合“存在重复就纳入统计”的需求
- 最后group by写的是
FUN_ID,跟select里的ID字段对不上,数据库直接抛错 - 嵌套exists的写法太绕:每扫到一条目标记录,就要回头算一次同ID下的目标记录总数,同一个ID算好几遍,白耗性能
更简洁高效的实现遵循“先缩小数据范围、再分组统计”的思路,仅需单次扫描即可完成计算:
SELECT ID, MIN(Begin) AS Begin FROM contract -- 先过滤出所有END为9999-12-31的记录,跳过无关数据 WHERE END = '9999-12-31' GROUP BY ID -- 只要同ID下这类记录数大于1,就判定为存在重复 HAVING COUNT(*) > 1
执行效果
针对示例数据,返回结果与预期完全匹配:
| ID | Begin |
|---|---|
| 20 | 2016-01-01 |
| 30 | 2019-03-01 |
ID=10在END为9999-12-31的记录仅存在1条,不满足重复判断条件,因此不会出现在结果集中。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

