在 postgres 中生成 array-agg(...)s

Generating array-agg(...)s in postgres

使用 Postgres 10 我有 tables 表示 'units',每个单元所属的 'group',以及每对单元之间的 'distance'。

我现在想要一个组到组的距离 table 聚合每对组的所有单元到单元的距离 - 即一个组中所有单元的距离的聚合数组给另一组的所有单位。

我有什么

  'units'          'unit_distances'
  id | group       this_unit_id | that_unit_id | distance      
  ----------       --------------------------------------
  1  |   1            1         |   2          | d_12
  2  |   1            1         |   3          | d_13
  3  |   2            1         |   4          | d_14
  4  |   3            2         |   3          | d_23
...  | ...          ...         | ...          |  ...

我想要的

'group_distances'
this_group_id | that_group_id | all_distances
---------------------------------------------------
  1            |   2          | {d_13, d_23}
  1            |   3          | {d_14, d_24}
  2            |   3          | {d_34}
...            | ...          | {..., ...

我不确定如何 return 所有组对组配对的所有此类数组并生成上面描述的 table。目前我只能通过单独定义站点(如下面的 x 和 y)来获取这些数组。

with dist as (
    select      distance 
    from        unit_distances
    inner join  units
    on          unit_distances.this_unit_id = units.id
    WHERE       units.group = x
intersect
    select      distance 
    from        unit_distances
    inner join  units
    on          unit_distances.that_unit_id = units.id
    WHERE       units.group = y)

select  array_agg(distance) from dist;

谢谢

如果我没理解错的话,这只是获取组的两个连接和距离的聚合:

select u1.group, u2.group, array_agg(ud.distance) as all_distances
from unit_distances ud join
     units u1
     on ud.this_unit_id = u1.id join
     units u2
     on ud.that_unit_id = u2.id
group by u1.group, u2.group;