You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动