web-dev-qa-db-fra.com

PostgreSQL tableau_agg ordre

Tableau 'animaux':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

Question:

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

Résultat attendu:

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

Puis-je être sûr que l'ordre dans la première fonction d'agrégat sera toujours le même que dans la seconde. Je veux dire que je n'aimerais pas recevoir:

Tom;Jerry;Kermit, Frog;Mouse,Cat
81
Olo

Si vous utilisez une version de PostgreSQL <9.0, alors:

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

Dans la mise en œuvre actuelle, l'ordre des entrées est en principe non spécifié. Toutefois, la fourniture des valeurs d'entrée à partir d'une sous-requête triée fonctionnera généralement. Par exemple:

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

Donc, dans votre cas, vous écririez:

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;

L'entrée dans array_agg serait alors désordonnée mais identique dans les deux colonnes. Et si vous le souhaitez, vous pouvez ajouter un ORDER BY clause à la sous-requête.

25
UlfR

Utilisez un ORDER BY, comme cet exemple du manual :

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