Получение общего значения счетчика столбца текстового массива в Postgres - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть таблица, которая выглядит следующим образом:

id   num
---  ----
1    {'1','2','3','3'}
2    {'2','3'}
3    {'5','6','7'}

Здесь id - это уникальный столбец, а num - это текстовый массив , которыйможет содержать повторяющиеся элементы.Я хочу сделать что-то вроде пересечения между двумя последовательными строками, чтобы получить общее число элементов между num двух рядов.Рассмотрим что-то вроде набора, в котором дубликаты рассматриваются только один раз.Например, для приведенной выше таблицы я ожидаю что-то вроде следующего:

id1   id2  count
---   ---  -----
1      2    2
1      3    0
2      1    2
2      3    0
3      1    0
3      2    0

Нет необходимости получать выходные данные, как указано выше.Единственная часть, которая меня беспокоит, это count.

У меня есть следующий запрос, который дает вывод только для одного идентификатора по сравнению с одним другим идентификатором:

select unnest(num) from emp where id=1
intersect
select unnest(num) from emp where id=2

Как я могу обобщитьэто чтобы получить требуемый вывод?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Прямой подход помещает пересечение невыпрошенных массивов в подзапрос и получает их счет.

SELECT t1.id id1,
       t2.id id2,
       (SELECT count(*)
               FROM (SELECT num1.num
                            FROM unnest(t1.num) num1(num)
                     INTERSECT
                     SELECT num2.num
                            FROM unnest(t2.num) num2(num)) x) count
       FROM emp t1
            INNER JOIN emp t2
                       ON t2.id > t1.id
       ORDER BY t1.id,
                t2.id;

Если вас интересует только то, разделяют ли массивы элементы или нет, но не точный счетВы также можете использовать оператор перекрытия &&.

SELECT t1.id id1,
       t2.id id2,
       t1.num && t2.num intersection_not_empty
       FROM emp t1
            INNER JOIN emp t2
                       ON t2.id > t1.id
       ORDER BY t1.id,
                t2.id;
0 голосов
/ 30 декабря 2018

Для данных примера это работает:

with t as (
      select v.*
      from (values (1000, array['acct', 'hr']), (1005, array['dev', hr'])) v(empid, depts)
     )
select t1.empid, t2.empid,
       (select count(distinct d1)
        from unnest(t1.depts) d1 join
             unnest(t2.depts) d2
             on d1 = d2
       ) cnt
from t t1 join
     t t2
     on t1.empid < t2.empid;

Я не уверен на 100%, что вы намерены.

...