【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 2021-02-03
        • 2015-07-22
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多