Dado um conjunto de dados (com um GIN
índice em values
):
key | values
-------------
1 | {4,2,1}
1 | {2,5}
2 | {4,1,3}
Eu quero agregar os arrays:
key | values
-------------
1 | {4,2,1,5}
2 | {4,1,3}
Meu primeiro pensamento não funcionou:
SELECT key, array_agg(DISTINCT unnest(values)) AS values FROM data GROUP BY key
[0A000] ERRO: as chamadas de função agregada não podem conter chamadas de função de retorno de conjunto
Dica: você pode mover a função de retorno de conjunto para um item LATERAL FROM.
Não estando familiarizado com LATERAL FROM
, não é óbvio para mim como obter a saída desejada.
Você precisa fazer o desaninhamento em uma subconsulta:
As funções de retorno de conjunto (como
unnest()
) geralmente devem ser usadas nafrom
parte de uma consulta. Mas para poder referenciar uma coluna da tabela você precisa de uma junção lateral .from data cross join lateral unnest(...)
é uma maneira explícita de escreverfrom data, unnest(...)
que também gera uma junção cruzada. Mas eu prefiro ocross join
operador explícito para documentar que eu realmente pretendia escrever uma junção cruzada, em vez de acidentalmente.No entanto, isso não preservará a ordem dos elementos.
Exemplo online: https://rextester.com/TVIDB57711