Orden de array_agg de PostgreSQL

107

Tabla 'animales':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

Consulta:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;

Resultado Esperado:

Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse

¿Puedo estar seguro de que el orden en la primera función agregada siempre será el mismo que en la segunda? Quiero decir que no me gustaría conseguir:

Tom;Jerry;Kermit, Frog;Mouse,Cat
Olo
fuente
7
Si está en 9.0, puede reemplazar las llamadas anidadas con una solastring_agg()
a_horse_with_no_name

Respuestas:

27

Si tiene una versión de PostgreSQL <9.0, entonces:

De: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

En la implementación actual, el orden de entrada no está especificado en principio. Sin embargo, proporcionar los valores de entrada de una subconsulta ordenada normalmente funcionará. Por ejemplo:

SELECT xmlagg (x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;

Entonces en tu caso escribirías:

SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM (SELECT animal_name, animal_type FROM animals) AS x;

La entrada al array_agg estaría desordenada pero sería la misma en ambas columnas. Y si lo desea, puede agregar una ORDER BYcláusula a la subconsulta.

UlfR
fuente
331

Utilice un ORDER BY, como este ejemplo del manual :

SELECT array_agg(a ORDER BY b DESC) FROM table;
Frank Heikens
fuente
42
Nota: ORDER BYen el array_aggse introduce en PostgreSQL 9
Ulfr
6
Mucho mejor que la respuesta aceptada asumiendo PostgreSQL 9+.
Erik
1
¿Podría dar una muestra con ORDER BY para seleccionar: SELECT array_agg (animal_name), array_agg (animal_type) FROM animals; ?
Grigory Kislin
9
Tenga en cuenta que esto no funciona paraarray_agg(DISTINCT a ORDER BY b)
cerd
1
Cuando se usa para varias columnas, debe agregar paréntesis:array_agg((a, b, c) ORDER BY b)
bennos