SQL分组查询:GROUP BY时如何同时保留剧集名称列?
解决方案
当然可以同时保留这两列,核心是先锁定每个国家的最高热度值,再匹配回对应的剧集;或者用窗口函数直接标记出每个国家的Top1剧集。下面是两种常用实现方式:
方法1:子查询关联
先通过子查询获取每个国家的最高热度,再和原表关联匹配对应的剧集名称:
SELECT t.origin_country, t.name, t.popularity AS Most_popular FROM TV_data t JOIN ( SELECT origin_country, MAX(popularity) AS max_pop FROM TV_data WHERE origin_country NOT LIKE '%(%' GROUP BY origin_country ) sub ON t.origin_country = sub.origin_country AND t.popularity = sub.max_pop WHERE t.origin_country NOT LIKE '%(%' ORDER BY Most_popular DESC;
注意:如果同一国家有多部剧集热度相同且都是最高值,这个查询会返回所有这些剧集;若想只返回一条,可额外添加排序条件(比如按剧集ID、名称排序)。
方法2:窗口函数(推荐,适用于MySQL 8+/PostgreSQL/SQL Server等支持窗口函数的方言)
用ROW_NUMBER()或RANK()给每个国家的剧集按热度排序,筛选出排名第一的条目:
SELECT origin_country, name, popularity AS Most_popular FROM ( SELECT origin_country, name, popularity, -- ROW_NUMBER()会给同热度剧集分配不同排名,仅保留第一条;RANK()会保留并列排名 ROW_NUMBER() OVER(PARTITION BY origin_country ORDER BY popularity DESC) AS rn FROM TV_data WHERE origin_country NOT LIKE '%(%' ) ranked WHERE rn = 1 ORDER BY Most_popular DESC;
如果需要保留同热度的并列剧集,把ROW_NUMBER()替换成RANK()即可。
你之前的查询问题原因
当把name加入GROUP BY后,SQL会按国家+剧集名称的组合分组,每个组合都会计算一次最大热度(实际就是该剧集自身的热度),因此会返回同一国家的多部剧集,不符合“每个国家只留Top1”的需求。
内容的提问来源于stack exchange,提问作者Odd Octopode
相关产品推荐
相关产品推荐

