SQL中DISTINCT失效问题:为何查询仍出现重复game_id?
解决DISTINCT后仍出现重复game_id的问题
嘿,我来帮你搞定这个问题!你遇到的情况其实很常见——DISTINCT并不是只针对game_id去重,它是对整行的所有字段组合进行去重判断的。也就是说,只要game_id相同但spike或者tweets_per_minute不一样,DISTINCT就会把它们当成不同的行保留下来,这就是为什么你还能看到重复的game_id。
下面给你两种针对性的解决方案,根据你的需求选就行:
方案1:用GROUP BY聚合同一game_id的记录
如果你希望每个game_id只出现一次,并且需要对spike和tweets_per_minute做聚合处理(比如取最大值、平均值),可以用GROUP BY:
SELECT game_id, MAX(spike) AS spike, -- 这里用MAX/AVG/MIN取决于你想保留哪个值 MAX(_c0) AS tweets_per_minute FROM virtual4 GROUP BY game_id ORDER BY tweets_per_minute DESC LIMIT 10;
这个语句会把所有相同game_id的行合并,并用聚合函数(比如MAX)提取你需要的spike和推文数值,确保每个game_id唯一。
方案2:用窗口函数筛选每个game_id的目标行
如果你想保留spike和tweets_per_minute的原始值,但每个game_id只留一条(比如对应最高推文数的那一行),可以用窗口函数ROW_NUMBER():
SELECT game_id, spike, tweets_per_minute FROM ( SELECT game_id, spike, _c0 AS tweets_per_minute, -- 给每个game_id的行按推文数降序排名 ROW_NUMBER() OVER (PARTITION BY game_id ORDER BY _c0 DESC) AS row_rank FROM virtual4 ) AS ranked_data WHERE row_rank = 1 -- 只取每个game_id排名第一的行 ORDER BY tweets_per_minute DESC LIMIT 10;
这个方法会先给每个game_id的所有行排序,然后只保留排名第一的那一行,既保证了game_id唯一,又能保留对应最高推文数的原始字段值。
内容的提问来源于stack exchange,提问作者user6203336
相关产品推荐
相关产品推荐

