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 按特定条件分组并计数的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中按多个内连接的条件计数

Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序

按条件分组和计数

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

MongoDB 根据条件按计数分组

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则