PostgreSQL 按特定条件分组并计数
Posted
技术标签:
【中文标题】PostgreSQL 按特定条件分组并计数【英文标题】:PostgreSQL group by and count on specific condition 【发布时间】: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
【问题讨论】:
【参考方案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
【讨论】:
以上是关于PostgreSQL 按特定条件分组并计数的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序