Генерация массива-агг (...) в postgres - PullRequest
0 голосов
/ 01 ноября 2018

Используя Postgres 10, у меня есть таблицы, представляющие «единицы», «группу», к которой принадлежит каждая единица, и «расстояние» между каждой парой единиц.

Теперь мне нужна таблица расстояний от группы к группе, которая агрегирует все расстояния от единицы к единице для каждой пары групп, то есть совокупный массив расстояний от всех единиц в одной группе до всех единиц в другая группа.

Что у меня есть

  '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}
...            | ...          | {..., ...

Я не уверен, как вернуть все такие массивы для всех пар групп и групп и сгенерировать таблицу, изображенную выше. В настоящее время я могу получить эти массивы только путем определения сайтов по отдельности (как х и у ниже).

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;

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Если я правильно понимаю, это всего два соединения для получения групп и агрегирование для расстояний:

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;
...