2011-09-06 18 views
52

Tablo 'hayvanlar':PostgreSQL array_agg sipariş

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

Sorgu:

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

Beklenen sonuç:

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

Ben ilk toplama işlevi sipariş daima olacağından emin olabilir miyiz saniyede olduğu gibi.

Tom;Jerry;Kermit, Frog;Mouse,Cat 
+6

9.0'daysanız, iç içe geçmiş çağrıları tek bir 'string_agg() ile değiştirebilirsiniz. –

cevap

20

Eğer < 9.0 sonra PostgreSQL sürümü üzerinde ise:

Gönderen: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

Mevcut uygulamada, girdinin sırası prensip olarak belirtilmemiş. Bununla birlikte, sıralanmış bir alt sorgudan giriş değerlerinin sağlanması genellikle işe yarar. Örneğin:

SELECT xmlagg (x) FROM (SELECT x FROM test SİPARİŞ BY Y DESC) AS sekmesi;

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; 

array_agg giriş sonra sırasız olurdu ama ikisi sütunlarında aynı olacaktır:

Yani durumda yazardım. Ve isterseniz, alt sorguya bir ORDER BY tümceyi ekleyebilirsiniz.

+0

Bunu düşündüm ama buggy çıktı zaman ben bir alt sorguda garip bir şekilde bu emri işe yaramadı https://stackoverflow.com/questions/16248813/is-order-in- a-alt sorgu garanti-için korunur – Adamantish

171

bir SİPARİŞ BY kullanın manual gelen bu örnekteki gibi: ben almak ister would't anlamına

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

Not:' dizi_agg'de 'SİPARİŞ BY', PostgreSQL 9'a dahil edilir – UlfR

+4

PostgreSQL 9+ kabul edilen yanıttan çok daha iyi. – Erik

+1

Seçim için ORDER BY ile örnek verebilir misiniz? SELECT array_agg (animal_name), array_agg (animal_type) FROM hayvanlar; ? – GKislin