functions - PostgreSQL array_agg order
postgresql boolean aggregate functions (2)
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 el segundo? Quiero decir que no me gustaría obtener:
Tom;Jerry;Kermit, Frog;Mouse,Cat
Use una ORDEN POR, como este ejemplo del manual :
SELECT array_agg(a ORDER BY b DESC) FROM table;
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 la entrada en principio no está especificado. Sin embargo, el suministro de los valores de entrada desde una subconsulta ordenada funcionará. Por ejemplo:
SELECCIONE xmlagg (x) FROM (SELECCIONE x DESDE la prueba ORDER BY y DESC) AS tabulación;
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 entonces desordenada, pero sería la misma en ambas columnas. Y si lo desea, podría agregar una cláusula ORDER BY
a la subconsulta.