postgres:取消一个数组并计算总数

时间:2016-11-12 19:12:40

标签: postgresql

我的数据如下:

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值的对位总数和对手pid值,它们之间的总和以及一对胜负。正如您所看到的那样,losing_pid列中的winning_pid值从未显示pid值,因为UNNEST()值没有获胜,但这些值必须位于总计表中。

是否有使用SELECT DISTINCT ON (pair) UNNEST(pair) as pid, COUNT(*) FILTER ( WHERE pid = winning_pid ) AS wins对的快速解决方案?我做不到这样的事情:

pid因为它无法识别FILTER子句中的UNNEST()

我也在想pid不是我想要的,因为我想要一个同时具有class="muted值的结果表,而不是那个。

谢谢!

1 个答案:

答案 0 :(得分: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中测试。