Postgres:将列聚合成数组

时间:2016-08-08 19:11:01

标签: postgresql

我有以下两个表:

# select * from list;
  list_id |         name
 ---------+----------------------
        9 | Popular
       11 | Recommended

# select * from list_item;
 list_id | game_id | position 
---------+---------+----------
      11 |       2 |        0
       9 |      10 |        1
      11 |       5 |        1
      11 |       4 |        4
      11 |       6 |        2
      11 |       7 |        3
       9 |       3 |        0

我希望每个列表都有一系列游戏ID:

 list_id |     name    | game_ids
---------+-------------+------------
       9 | Popular     | {3,10}
      11 | Recommended | {2,5,6,7,4}

我提出了以下解决方案,但它似乎相当复杂,尤其是我使用distinct onlast_value得到完整数组的位:

with w as (
  select
    list_id,
    name,
    array_agg(game_id) over (partition by list_id order by position)
  from list
  join list_item
  using (list_id)
)
select
  distinct on (list_id)
  list_id,
  name,
  last_value(array_agg) over (partition by list_id)
from w

有关如何简化此操作的任何建议吗?

1 个答案:

答案 0 :(得分:4)

这是Abelisto在评论中提出的更好的解决方案:

select
  list_id,
  name,
  array_agg(game_id order by position)
from list
join list_item
using (list_id)
group by list_id, name