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