【问题标题】:PostgreSQL group by and count on specific conditionPostgreSQL 按特定条件分组并计数
【发布时间】:2022-01-08 15:05:18
【问题描述】:
我有以下表格(示例)
Analyze_Line
| id |
game_id |
bet_result |
game_type |
| 1 |
1 |
WIN |
0 |
| 2 |
2 |
LOSE |
0 |
| 3 |
3 |
WIN |
0 |
| 4 |
4 |
LOSE |
0 |
| 5 |
5 |
LOSE |
0 |
| 6 |
6 |
WIN |
0 |
游戏
| id |
league_id |
home_team_id |
away_team_id |
| 1 |
1 |
1 |
2 |
| 2 |
2 |
2 |
3 |
| 3 |
3 |
3 |
4 |
| 4 |
1 |
1 |
2 |
| 5 |
2 |
2 |
3 |
| 6 |
3 |
3 |
4 |
所需数据:
| league_id |
WIN |
LOSE |
GameCnt |
| 1 |
1 |
1 |
2 |
| 2 |
0 |
2 |
2 |
| 3 |
2 |
0 |
2 |
Analyze_Line 表与 Game 表相连,简单可以通过 League_id 获得 GameCnt 分组,但我不知道如何计算赢计和输计入bet_result
【问题讨论】:
标签:
postgresql
join
select
group-by
count
【解决方案1】:
您可以在聚合函数中使用条件来划分每个联赛的输赢投注结果。
select
g.league_id,
sum(case when a.bet_result = 'WIN' then 1 end) as win,
sum(case when a.bet_result = 'LOSE' then 1 end) as lose,
count(*) as gamecnt
from
game g
inner join analyze_line a on
g.id = a.game_id
group by
g.league_id
由于没有提及 postgresql 版本,我不建议使用 FILTER 子句(特定于 postgres),因为它可能不适合您。
【解决方案2】:
添加到Kamil's answer - PostgreSQL 在大约八年前(2014 年 12 月)发布的 PostgreSQL 9.4 中引入了过滤子句。在这一点上,我认为在答案中使用它是足够安全的。恕我直言,它比对 case 表达式求和更优雅,但它确实具有 PostgreSQL 特定语法的缺点,因此不可移植:
SELECT g.league_id,
COUNT(*) FILTER (WHERE a.bet_result = 'WIN') AS win,
COUNT(*) FILTER (WHERE a.bet_result = 'LOSE') AS lose,
COUNT(*) AS gamecnt
FROM game g
JOIN analyze_line a ON g.id = a.game_id
GROUP BY g.league_id