2016-11-12 274 views
1

我有數據,看起來像這樣:Postgres的:unnesting數組和計數總計

winning_pid losing_pid pair wins 
      1   2 1,2  7 
      2   1 1,2  3 
      3   4 3,4  2 

而且我要的結果,看起來像這樣:

pid opp_pid total wins losses 
    1  2  10  7  3 
    2  1  10  3  7 
    3  4  2  2  0 
    4  3  2  0  2 

它基本上是:每pid對決總數價值和一個對手的價值,以及他們之間的總和和贏得和失敗的數量。正如你所看到的,你有losing_pid值永遠不會顯示在winning_pid列,因爲pid值沒有勝利,但這些都需要在總計表中。

在配對上使用UNNEST()有沒有快速解決方案?我不能這樣做:

SELECT DISTINCT ON (pair) UNNEST(pair) as pid, COUNT(*) FILTER (WHERE pid = winning_pid) AS wins,因爲它不能識別FILTER條款中的pid

我也在想UNNEST()不是我想要的,因爲我想要一個既有pid值也有結果表,而不僅僅是一個。

謝謝!

回答

1

用於交換的結果使用union:

select 
    pid, 
    opp_pid, 
    sum(wins + loses) total, 
    sum(wins) wins, 
    sum(loses) loses 
from (
    select winning_pid pid, losing_pid opp_pid, wins, 0 loses 
    from example 
    union 
    select losing_pid, winning_pid, 0, wins 
    from example 
) s 
group by 1, 2 
order by 1, 2; 

測試它rextester