如何去除重复行?使用DISTINCT后pays列仍存重复的问题求助
问题分析与解决
你的问题核心出在GROUP BY的逻辑设计以及对DISTINCT作用的误解上:
- DISTINCT在这里完全无效,因为GROUP BY已经按
nom完成了分组,结果集里的每一行都是一个nom的聚合结果,DISTINCT是对整行的三列组合去重,无法单独实现pays列的去重。 - 执行结果中
pays出现重复,分两种情况:- 不同导演(不同
nom)来自同一个国家——这是正常数据现象,无需处理; - 同一个
nom对应多个不同国家的导演——你只按nom分组,数据库会随机返回该nom下某一个人的pays,同时错误合并了他们的影片计数。
- 不同导演(不同
对应解决方案
情况2修正(同名不同国家导演不被合并)
修改GROUP BY子句,将pays也加入分组,确保每个分组对应唯一的导演(名字+国家):
SELECT pays, nom, COUNT(titre) FROM film JOIN personne ON film.idRealisateur = personne.id GROUP BY pays, nom ORDER BY COUNT(titre) DESC LIMIT 10
需求为「每个国家仅显示影片最多的导演」
如果你的目标是让结果中pays无重复(即每个国家只保留影片数量最多的导演),需要用窗口函数实现:
WITH ranked_directors AS ( SELECT pays, nom, COUNT(titre) AS film_count, ROW_NUMBER() OVER (PARTITION BY pays ORDER BY COUNT(titre) DESC) AS rn FROM film JOIN personne ON film.idRealisateur = personne.id GROUP BY pays, nom ) SELECT pays, nom, film_count FROM ranked_directors WHERE rn = 1 ORDER BY film_count DESC LIMIT 10
内容的提问来源于stack exchange,提问作者Anteste
相关产品推荐
相关产品推荐

