如何筛选DefaultMessage列存在重复值的数据集?
查找不同TravellerID下重复的DefaultMessage条目
需要从包含10000+行数据的表中,找出不同TravellerID下拥有相同DefaultMessage的条目,无法提前知道具体消息内容,因此不能在WHERE子句中指定固定搜索值。之前尝试自连接(SELF JOIN)但返回了全部数据,未达到预期效果。
示例数据表
| TravellerID | Traveller | DefaultMessage |
|---|---|---|
| 1 | J: 182 | I travelled to US |
| 2 | J: 192 | I travelled to IND |
| 3 | K: 901 | I travelled to GBR |
| 4 | M: 531 | I travelled to US |
| 5 | N: 231 | I travelled to AUS |
期望输出
| TravellerID | Traveller | DefaultMessage |
|---|---|---|
| 1 | J: 182 | I travelled to US |
| 4 | M: 531 | I travelled to US |
方法1:分组统计+子查询(推荐,大数据量效率更高)
先通过分组筛选出被多个不同用户使用的DefaultMessage,再关联原表获取完整条目:
SELECT t.* FROM your_table_name t JOIN ( SELECT DefaultMessage FROM your_table_name GROUP BY DefaultMessage HAVING COUNT(DISTINCT TravellerID) > 1 ) dup_msg ON t.DefaultMessage = dup_msg.DefaultMessage ORDER BY t.DefaultMessage, t.TravellerID;
COUNT(DISTINCT TravellerID)确保只筛选不同用户的重复消息,排除同一用户自身的重复条目- 分组统计的逻辑在大数据量下执行效率优于自连接
方法2:修正后的自连接
之前自连接返回全部数据是因为缺少关键过滤条件,添加条件后可精准定位目标数据:
SELECT DISTINCT t1.* FROM your_table_name t1 JOIN your_table_name t2 ON t1.DefaultMessage = t2.DefaultMessage AND t1.TravellerID != t2.TravellerID ORDER BY t1.DefaultMessage, t1.TravellerID;
t1.TravellerID != t2.TravellerID确保只匹配不同用户的重复消息DISTINCT避免同一行数据被重复输出(比如t1为ID1、t2为ID4,与t1为ID4、t2为ID1会产生重复结果)
内容的提问来源于stack exchange,提问作者Kreeshee
相关产品推荐
相关产品推荐

