按日期分组,基于枚举类型位置列获取各位置最高得分及球员姓名
按日期分组获取各位置最高得分及对应球员的解决方案
我来帮你搞定这个统计需求!针对带有sector枚举列(取值为Midfielder/Forward/Defender/Goalkeeper)的数据集,我们可以用SQL的窗口函数+条件聚合来实现按日期分组,输出每个位置的最高得分和对应球员,缺失数据的位置自动填充null(如果需要填充0,也可以轻松调整)。
假设数据集结构
先假设你的表名为player_scores,包含以下字段:
date:比赛日期(日期类型)player_name:球员姓名(字符串类型)sector:球员位置(枚举类型,取值为指定的四个位置)score:球员得分(数值类型)
实现步骤与代码
第一步:给每个日期+位置的记录按得分排名
先用窗口函数ROW_NUMBER()给每个日期下的每个位置的记录按得分降序排名,这样每个组里排名第1的就是该日期该位置得分最高的球员(如果有同分情况,ROW_NUMBER()会随机选一个;要是想保留所有同分球员,可以换成RANK(),后续用字符串拼接名字)。
WITH ranked_scores AS ( SELECT date, player_name, sector, score, -- 按日期+位置分组,得分降序排名 ROW_NUMBER() OVER (PARTITION BY date, sector ORDER BY score DESC) AS rank_num FROM player_scores )
第二步:条件聚合转成目标格式
接下来用条件聚合把各个位置的得分和球员转成单独的列,按日期分组后输出,缺失的位置会自动填充null:
SELECT date, -- 中场位置的最高得分和对应球员 MAX(CASE WHEN sector = 'Midfielder' THEN score ELSE NULL END) AS mid_score, MAX(CASE WHEN sector = 'Midfielder' AND rank_num = 1 THEN player_name ELSE NULL END) AS midfielder, -- 前锋位置的最高得分和对应球员 MAX(CASE WHEN sector = 'Forward' THEN score ELSE NULL END) AS forward_score, MAX(CASE WHEN sector = 'Forward' AND rank_num = 1 THEN player_name ELSE NULL END) AS forward, -- 后卫位置的最高得分和对应球员 MAX(CASE WHEN sector = 'Defender' THEN score ELSE NULL END) AS def_score, MAX(CASE WHEN sector = 'Defender' AND rank_num = 1 THEN player_name ELSE NULL END) AS defender, -- 门将位置的最高得分和对应球员 MAX(CASE WHEN sector = 'Goalkeeper' THEN score ELSE NULL END) AS gk_score, MAX(CASE WHEN sector = 'Goalkeeper' AND rank_num = 1 THEN player_name ELSE NULL END) AS goalkeeper FROM ranked_scores WHERE rank_num = 1 -- 只保留每个组里得分最高的记录 GROUP BY date ORDER BY date; -- 按日期排序输出
调整说明
- 如果需要把缺失的得分填充为
0,只需要把ELSE NULL改成ELSE 0即可(球员名字只能填充null,毕竟不能用数字代表姓名)。 - 如果遇到同分球员需要全部展示,把
ROW_NUMBER()换成RANK(),然后把MAX(player_name)改成STRING_AGG(player_name, ', ')(PostgreSQL/MySQL 8+支持,不同数据库语法略有差异),这样就能把同分球员的名字用逗号拼接起来。
模拟输出结果
| date | mid_score | midfielder | forward_score | forward | def_score | defender | gk_score | goalkeeper |
|---|---|---|---|---|---|---|---|---|
| 2017-12-26 | 91 | Dele Alli | 85 | Harry Kane | 74 | Jan Vertonghen | 78 | Hugo Lloris |
| 2017-12-27 | 61 | Eric Dier | null | null | 68 | Maya Yoshida | 65 | Michel Vorm |
| 2017-12-28 | null | null | 79 | Son Heung-min | null | null | 72 | Paulo Gazzaniga |
内容的提问来源于stack exchange,提问作者pravin dabhi
相关产品推荐
相关产品推荐

