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

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.


331

Utilice un ORDER BY, como este ejemplo del manual :

SELECT array_agg(a ORDER BY b DESC) FROM table;

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.