多列GROUP BY不生效:如何统计团队在不同赛事的夺冠次数
问题描述
现有table_results表,数据如下:
Tournament Team Round Placement 41 1 1 1 72 6 2 1 16 8 2 5 33 2 1 4 36 4 1 2 90 1 2 5 33 3 1 1 10 7 1 1 41 1 2 1 72 3 2 2 16 4 2 3 33 1 1 1 72 2 2 3
需求是统计某支队伍(比如Team 1)在不同赛事中获得第一名的次数,不考虑轮次。
编写的SQL语句:
SELECT Team, COUNT(*) from table_results WHERE Team='1' AND Placement='1' GROUP BY Tournament, Team
当前查询结果:
Team COUNT(*) 1 2 1 1 1 1
期望得到合并后的总数:
Team COUNT(*) 1 3
已知GROUP BY多列会按顺序分组,但当前查询未合并分组结果计数,请问哪里操作错误?
问题分析与解决
问题出在分组逻辑上:
- 原SQL按
Tournament, Team分组,会把每个「赛事+队伍」的组合单独成组,最终得到的是每个赛事里Team 1拿第一的次数(比如赛事41里有2次第一,赛事33和10各1次),而非拿过第一的不同赛事总数。
要实现需求,核心是先对Tournament去重再计数,有两种简洁的实现方式:
方式1:直接使用COUNT(DISTINCT)
只按Team分组,同时对赛事ID去重后计数:
SELECT Team, COUNT(DISTINCT Tournament) AS first_place_tournaments FROM table_results WHERE Team='1' AND Placement='1' GROUP BY Team;
方式2:子查询去重后再计数
先通过子查询筛选出Team 1拿过第一的所有唯一赛事,再对结果计数:
SELECT Team, COUNT(*) AS first_place_tournaments FROM ( SELECT DISTINCT Tournament, Team FROM table_results WHERE Team='1' AND Placement='1' ) AS unique_tournaments GROUP BY Team;
两种方式都能得到期望结果:
Team first_place_tournaments 1 3
内容的提问来源于stack exchange,提问作者DaltonRandall
相关产品推荐
相关产品推荐

