在postgresql中计算赢,平局和丢失的游戏

时间:2016-06-11 10:30:24

标签: postgresql ruby-on-rails-4 postgresql-9.5

我有两张桌子和#34;匹配"和#34;对手"。

匹配

id | date
---+------------
1  | 2016-03-21 21:00:00
2  | 2016-03-22 09:00:00
...

对手 (如果没有播放,则分数为空)

id | match_id | team_id | score
---+----------+---------+------------
1  |  1       |  1      |  0
2  |  1       |  2      |  1
3  |  2       |  3      |  1
4  |  2       |  4      |  1
4  |  3       |  1      |  
4  |  3       |  2      |  
....

目标是创建下表

Team | won | tie | lost | total
-----+-----+-----+------+----------
2    | 1   | 0   | 0    | 1
3    | 0   | 1   | 0    | 1
4    | 0   | 1   | 0    | 1
1    | 0   | 0   | 1    | 1

Postgres v9.5

我该怎么做? (如果有意义的话,我可以将"得分"移到我模型中的其他地方。)

1 个答案:

答案 0 :(得分:0)

分裂和阻碍我的儿子

with teams as (
    select distinct team_id from opponents
), 
teamgames as (
    select t.team_id, o.match_id, o.score as team_score, oo.score as opponent_score 
    from teams t
    join opponents o on t.team_id = o.team_id
    join opponents oo on (oo.match_id = o.match_id and oo.id != o.id)
),
rankgames as (
    select 
        team_id, 
        case 
            when team_score > opponent_score then 1
            else 0
        end as win,
        case 
            when team_score = opponent_score then 1
            else 0
        end as tie,
        case 
            when team_score < opponent_score then 1
            else 0
        end as loss
    from teamgames
),
rank as (
    select 
        team_id, sum(win) as win, sum(tie) as tie, sum(loss) as loss,
        sum( win * 3 + tie * 1 ) as score
    from rankgames
    group by team_id
    order by score desc
)
select * from rank;

注1 :您可能不需要第一个&#34;&#34;因为你可能已经有一个每个团队有一个记录的表

Note2 :我认为您也可以通过一个查询获得相同的结果,但这样步骤更清晰