在 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;
使用 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;