Array_agg целочисленные массивы разной длины в postgres 9.5 - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь собрать целочисленные массивы разной длины. Этот ответ дополняется нулями, и я пытаюсь включить его в свой запрос.

Вот мои данные:

id   | col
-----+---------
1    | {5,3}
1    | {6,4}
2    | {3}
2    | {2,3}

Вот мой желаемый результат

    id   | col
    -----+---------
    1    | {{5,3},{6,4}}
    2    | {{3,NULL},{2,3}}

См. DBFiddle

Этомой текущий запрос, который агрегирует по идентификатору, но выводит дубликаты.Я впервые использую функцию LATERAL, поэтому не знаю, правильный ли это подход.

SELECT 
array_agg(
          array_cat(
            col,
            array_fill(NULL::smallint, ARRAY[lat-COALESCE(array_length(col, 1),0)])
          )
       ) AS result
,tab.id
FROM tab
,LATERAL (SELECT id,MAX(array_length(col,1)) AS lat
          FROM tab GROUP BY id) s
GROUP BY tab.id

1 Ответ

0 голосов
/ 16 октября 2018

Как насчет немного другого подхода:

SELECT id, ARRAY_AGG(CASE WHEN ARRAY_LENGTH(col, 1) < max_length THEN (col || ARRAY_FILL(NULL::SMALLINT, ARRAY[max_length]))[1:max_length] ELSE col END) AS result
FROM tab, (SELECT MAX(ARRAY_LENGTH(col, 1)) AS max_length FROM tab) m
GROUP BY id

Если длина меньше максимальной длины массива, добавьте массив максимальной длины, затем возьмите «ломтик» максимальной длины;в результате он работает так же, как OVERLAY для строк.

https://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=56b135d87dd919e84ca43daeaf2b081c

или немного по-другому:

SELECT id, ARRAY_AGG(CASE WHEN ARRAY_LENGTH(col, 1) < max_length THEN col || ARRAY_FILL(NULL::SMALLINT, ARRAY[max_length - ARRAY_LENGTH(col, 1)]) ELSE col END) AS result
FROM tab, (SELECT MAX(ARRAY_LENGTH(col, 1)) AS max_length FROM tab) m
GROUP BY id

Добавьте только необходимое число NULL кмассив.

https://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=22e86b81131a68844206338bf4428dab

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...