2016-06-11 5 views
0

私は2つのテーブル "マッチ"と "相手"を持っています。postgresqlで勝利、ネクタイ、ロストゲームを計算する

マッチ

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

反対派 (再生されない場合、スコアがnull)

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

を作成することです

どうすればいいですか? (それは理にかなっている場合は、おそらくどこかに私のモデルでの「スコア」を移動するオープンイム。)

答えて

0

デバイドらimpera息子

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:あなたはおそらく最初の必要はありません「と」あなたはおそらく、チームごとに1つのレコードに既にテーブルがあるとして

注2:私はあなたにも1つのクエリと同じ結果を得ることができると思いますが、この方法での手順が明確にされている

+0

Thansk @Jack、そのトリックはあります。私は、LATERAL結合などでは全く異なる方向性を考えていました。 – Marcus

関連する問題