functions ejemplos array_to_string array_agg array postgresql

ejemplos - postgresql group by function



Ordenar un agregado de texto creado con array_agg en postgresql (6)

¿Ha intentado usar generate_series() en la matriz y luego hacer un SELECT...ORDER BY en ese resultado (o simplemente anidarlo dentro de SELECT ) antes de convertirlo en una cadena?

Tengo una mesa en postgresql. La siguiente tabla "animales" servirá para explicar mi problema:

name ------ tiger cat dog

Ahora estoy usando la siguiente consulta:

SELECT array_to_string(array_agg("name"), '', '') FROM animals;

El resultado es: "tigre, gato, perro". Pero me gustaría ordenar el agregado, antes de que se convierta en una cadena. Así que este es el resultado que espero:

"cat, dog, tiger".

Entonces, ¿cómo puedo ordenar una matriz de cadenas en postgresql 8.4 antes de convertirla en una cadena? ORDER BY en la fila "nombre" no funciona y la función de clasificación incorporada procesa solo valores enteros.

¿Alguien es una buena idea, cómo resolver esto en SQL puro?

Muchas gracias Richard


Aún así, para la versión 8.4, utilizando la solución sugerida por Matthew Wood, si necesita hacer una agrupación en la consulta externa, la consulta interna también debe ordenarse para que la clasificación sea consistente.

SELECT family, array_agg(animal_name) FROM ( SELECT family, "name" AS animal_name FROM animals ORDER BY family, "name" ) AS sorted_animals group by family;


Aunque la respuesta de Matthew Wood es mejor para su caso, aquí hay una manera de ordenar los arreglos en PostgreSQL 8.4 y más:

SELECT array( SELECT unnest(array[3,2,1]) AS x ORDER BY x );

Conocer la array y unnest funciones unnest puede ser útil, ya que también le permite hacer cosas como "map" sobre una matriz:

SELECT array( SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery );

Nuevamente, esto puede ser suyo por el precio de PostgreSQL 8.4.


Esto estará disponible en PostgreSQL 9.0:

http://www.postgresql.org/docs/9.0/static/release-9-0.html , Sección E.1.3.6.1. Agregados

Mientras tanto, podrías hacer algo como esto que pueda resolver el problema (aunque sea un poco pesado):

SELECT array_agg(animal_name) FROM ( SELECT "name" AS animal_name FROM animals ORDER BY "name" ) AS sorted_animals;


Para PostgreSQL moderno (desde la versión 9.0), puede usar una cláusula ORDER BY en una expresión agregada :

SELECT array_to_string(array_agg(name ORDER BY name), '', '') FROM animals;

Además, para su propósito específico, puede usar string_agg para simplificar su consulta:

SELECT string_agg(name, '', '' ORDER BY name) FROM animals;


Para actualizar esta pregunta, Snowflake ha implementado la clasificación de matrices:

SELECT array_sort(array_agg("name") FROM animals;

También puede usar array_sort_by para ordenar un objeto