2016-11-12 131 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