如何在单表中添加球队进球状态列?SQL实现方案咨询
问题描述
我有一份简化的数据表示例:
| Soccer team | Player | Goals |
|---|---|---|
| Man. City | Haaland | 3 |
| Man. City | De Bruyne | 0 |
| Man. City | Foden | 0 |
| Man. Utd | Hojlund | 0 |
| Man. Utd | Onana | 0 |
| Man. Utd | Maguire | 0 |
我希望添加一列来判断球队是否有进球者,预期结果如下:
| Soccer team | Player | Goals | Goals in team |
|---|---|---|---|
| Man. City | Haaland | 3 | y |
| Man. City | De Bruyne | 0 | y |
| Man. City | Foden | 0 | y |
| Man. Utd | Hojlund | 0 | n |
| Man. Utd | Onana | 0 | n |
| Man. Utd | Maguire | 0 | n |
请问如何实现这一需求?应使用何种SQL语句?另外,我的表中还有约25个其他列,是否必须使用聚合函数并GROUP BY所有列,还是有更简便的方法?
解决方案
方法1:窗口函数(推荐)
窗口函数能在不合并原表行的前提下,按球队统计进球情况,完全不用GROUP BY所有列,适配你有大量额外列的场景。
SQL语句示例:
SELECT *, CASE WHEN MAX(Goals) OVER (PARTITION BY "Soccer team") > 0 THEN 'y' ELSE 'n' END AS "Goals in team" FROM your_table_name;
MAX(Goals) OVER (PARTITION BY "Soccer team"):按球队分组,计算每组的最大进球数- 通过CASE判断最大值是否大于0,输出对应的'y'或'n'
方法2:子查询关联
如果你的SQL环境不支持窗口函数,可以先通过子查询统计每个球队的进球状态,再和原表关联:
SELECT t.*, CASE WHEN s.has_goals THEN 'y' ELSE 'n' END AS "Goals in team" FROM your_table_name t JOIN ( SELECT "Soccer team", MAX(Goals) > 0 AS has_goals FROM your_table_name GROUP BY "Soccer team" ) s ON t."Soccer team" = s."Soccer team";
这个方法也只需要在子查询里按球队分组,不用处理原表的25个额外列。
关于GROUP BY的说明
你的需求是保留原表所有行并新增判断列,而GROUP BY是用来合并行做聚合统计的,完全不需要把25列都加到GROUP BY里,上面两种方法都能避免这个麻烦。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

