我正在尝试汇总具有不同长度的整数数组。 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
答案 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