如何用SQL查询ticket_id重复但source字段不同的重复记录
解决查询ticket_id相同但source不同的重复记录问题
嘿,我懂你要找的是那些ticket_id相同但source字段不一样的重复记录对吧?你之前写的SQL其实是在统计同一个ticket_id和source组合重复出现的次数,和你实际需求不匹配哦~
我给你两种实用的解决方法:
方法一:子查询关联法
先找出所有存在至少两个不同source的ticket_id,再获取这些ticket_id对应的所有记录:
SELECT t.* FROM mytable t WHERE t.ticket_id IN ( SELECT ticket_id FROM mytable GROUP BY ticket_id HAVING COUNT(DISTINCT source) > 1 );
解释:
- 内层子查询按
ticket_id分组,用COUNT(DISTINCT source) > 1筛选出那些有多个不同source的ticket_id - 外层查询根据这些ticket_id,把原表中对应的所有记录都查出来,就是你标红的那些目标记录啦
方法二:窗口函数法(更高效)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),可以用这个更简洁的写法:
SELECT ticket_id, source -- 这里可以添加你需要的其他字段 FROM ( SELECT *, COUNT(DISTINCT source) OVER (PARTITION BY ticket_id) AS source_variants FROM mytable ) sub WHERE source_variants > 1;
部分数据库(比如BigQuery、Snowflake)支持QUALIFY关键字,还能再精简:
SELECT ticket_id, source -- 添加其他需要的字段 FROM mytable QUALIFY COUNT(DISTINCT source) OVER (PARTITION BY ticket_id) > 1;
解释:
- 窗口函数
COUNT(DISTINCT source) OVER (PARTITION BY ticket_id)会给每条记录计算它所属ticket_id下有多少种不同的source - 最后筛选出这个数量大于1的记录,直接得到目标结果
额外小工具:查看每个问题ticket_id的source详情
如果你想直观看到每个有问题的ticket_id对应的不同source列表,可以用这个:
SELECT ticket_id, GROUP_CONCAT(DISTINCT source) AS different_sources, -- MySQL写法,PostgreSQL用STRING_AGG,SQL Server用STRING_AGG COUNT(DISTINCT source) AS source_count FROM mytable GROUP BY ticket_id HAVING source_count > 1;
这个查询会列出每个ticket_id对应的所有不同source,以及source的种类数,方便你快速核对。
内容的提问来源于stack exchange,提问作者User1




