如何编写SQL查询筛选Policy重复但Lon-Lat组合不同的行
嘿,我来帮你搞定这个SQL查询需求!
核心思路
我们需要分两步走:
- 先找出那些存在至少两组不同(Lon, Lat)坐标的Policy值
- 再从原表中提取这些Policy对应的所有行,这些就是符合要求的记录
方案一:子查询方式(推荐,效率较高)
这个方法先通过子查询筛选出目标Policy,再关联原表获取数据:
SELECT t.* FROM `INSURANCE TABLE` t WHERE t.Policy IN ( SELECT Policy FROM `INSURANCE TABLE` GROUP BY Policy -- 统计每个Policy下不同的坐标组合数量,大于1说明有不同的坐标 HAVING COUNT(DISTINCT Lon, Lat) > 1 );
原理说明:
- 子查询里用
GROUP BY Policy分组,COUNT(DISTINCT Lon, Lat)会统计每个Policy对应的唯一坐标组合数,只要这个数大于1,就说明该Policy存在不同的坐标记录 - 主查询通过
IN条件,把原表中属于这些Policy的所有行都筛选出来,正好匹配你要的结果
方案二:自连接方式(逻辑直观)
如果觉得子查询不好理解,也可以用自连接的方式实现:
SELECT DISTINCT t.* FROM `INSURANCE TABLE` t JOIN `INSURANCE TABLE` t2 ON t.Policy = t2.Policy -- 匹配同一个Policy下坐标不同的行 AND (t.Lon != t2.Lon OR t.Lat != t2.Lat);
原理说明:
- 把表和自己做连接,当两行Policy相同但坐标不同时,就会产生匹配
- 用
DISTINCT去重,因为同一行会被多次匹配(比如行1和行3会互相匹配两次)
验证结果
这两个方案都会返回你预期的结果:
1 | 34564 | 2.0 | 4.0 3 | 34564 | 1.8 | 9.4 4 | 98271 | 4.3 | 2.3 6 | 98271 | 1.3 | 5.6
而Policy 90198的两行坐标完全相同,所以不会被筛选出来,符合要求。
内容的提问来源于stack exchange,提问作者user9241790
相关产品推荐
相关产品推荐

