PostgreSQL按match_id聚合统计每场比赛双方获胜局数的SQL实现
PostgreSQL 按比赛统计双方获胜局数
你可以用条件聚合函数实现需求,核心是在SUM()里嵌套CASE WHEN语句,逐局判断胜负后累加计数:
SELECT match_id, -- 统计player_one获胜局数:p1得分高于p2时计1,否则0 SUM(CASE WHEN p1_game_result > p2_game_result THEN 1 ELSE 0 END) AS player_one_wins, -- 统计player_two获胜局数:p2得分高于p1时计1,否则0 SUM(CASE WHEN p2_game_result > p1_game_result THEN 1 ELSE 0 END) AS player_two_wins, -- 可选:统计平局局数(若存在得分相等的情况) SUM(CASE WHEN p1_game_result = p2_game_result THEN 1 ELSE 0 END) AS draw_games, -- 总局数(和你现有查询逻辑一致,可选保留) COUNT(*) AS total_games FROM your_table_name -- 替换为你的实际表名 GROUP BY match_id ORDER BY match_id;
逻辑说明:
CASE WHEN逐行判断单局胜负关系,符合条件返回1,否则返回0SUM()将同一match_id下的所有局判断结果累加,得到该场比赛的总胜场数- 若数据中无平局或不需要统计平局,可直接删除
draw_games字段
示例结果:
假设表数据如下:
| match_id | p1_game_result | p2_game_result |
|---|---|---|
| 1 | 15 | 12 |
| 1 | 10 | 15 |
| 1 | 15 | 8 |
| 2 | 15 | 13 |
| 2 | 14 | 15 |
执行查询后会得到:
| match_id | player_one_wins | player_two_wins | draw_games | total_games |
|---|---|---|---|---|
| 1 | 2 | 1 | 0 | 3 |
| 2 | 1 | 1 | 0 | 2 |
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

