PostgreSQL array_agg sırası


110

Tablo 'hayvanlar':

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

İlk toplama işlevindeki sıranın her zaman ikincideki ile aynı olacağından emin olabilir miyim? Demek istediğim, şunu almak istemem:

Tom;Jerry;Kermit, Frog;Mouse,Cat

7
string_agg()
9.0'daysanız

Yanıtlar:


27

PostgreSQL <9.0 sürümündeyseniz, o zaman:

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

Mevcut uygulamada, girdinin sırası prensipte belirtilmemiştir. Bununla birlikte, giriş değerlerini sıralı bir alt sorgudan sağlamak genellikle işe yarar. Örneğin:

Sekme olarak xmlagg (x) 'i SEÇİN (test SİPARİŞİNE GÖRE x SEÇİN);

Yani senin durumunda yazacaksın:

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;

Dizi_agg girdisi daha sonra sırasız olacaktır, ancak her iki sütunda da aynı olacaktır. Ve isterseniz ORDER BYalt sorguya bir cümle ekleyebilirsiniz .


344

Kılavuzdaki şu örnek gibi bir ORDER BY kullanın :

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

43
Not: ORDER BYin array_agg, PostgreSQL 9
UlfR

6
PostgreSQL 9+ varsayılarak kabul edilen cevaptan çok daha iyi.
Erik

1
Lütfen aşağıdaki seçim için ORDER BY ile örnek verebilir misiniz: SELECT array_agg (hayvan_adı), array_agg (hayvan_tipi) hayvanlardan; ?
Grigory Kislin

11
Bu olmadığını Not değil için çalışmakarray_agg(DISTINCT a ORDER BY b)
cerd

1
Birden fazla sütun için kullanırken parantez eklemeniz gerekir:array_agg((a, b, c) ORDER BY b)
bennos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.