Postgres 9.5中不同长度的Array_agg整数数组

时间:2018-10-16 13:47:42

标签: postgresql

我正在尝试汇总具有不同长度的整数数组。 This answer填充了空值,我正在尝试将其合并到我的查询中。

这是我的数据:

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

这是我当前的查询,它通过id进行聚集,但输出重复项。这是我第一次使用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 :(得分:1)

一种稍微不同的方法如何:

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