You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:21:03