PostgreSQL array_agg命令


106

表“动物”:

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

查询:

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

预期结果:

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

我可以确定第一个聚合函数中的顺序将始终与第二个相同。我的意思是我不想得到:

Tom;Jerry;Kermit, Frog;Mouse,Cat

7
如果您使用的是9.0,则可以用一个string_agg()
a_horse_with_no_name 2011年

Answers:


27

如果您使用的是PostgreSQL版本9.0以下,则:

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

在当前的实现中,原则上未指定输入的顺序。但是,通常可以从已排序的子查询中提供输入值。例如:

SELECT xmlagg(x)FROM(SELECT x FROM test ORDER BY y DESC)AS选项卡;

因此,在您的情况下,您应该写:

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的输入将是无序的,但两列中的输入将相同。如果愿意,可以ORDER BY在子查询中添加一个子句。


330

使用ORDER BY,例如本手册中的示例:

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

41
注意:ORDER BYin array_agg是PostgreSQL 9
UlfR 2011年

6
比假设PostgreSQL 9+的公认答案要好得多。
Erik 2014年

1
您能否给ORDER BY提供样本以供选择:SELECT动物中的array_agg(animal_name),array_agg(animal_type);?
Grigory Kislin 2014年

8
请注意,这并没有对工作array_agg(DISTINCT a ORDER BY b)
消除种族歧视委员会

1
当用于多列时,您必须添加括号:array_agg((a, b, c) ORDER BY b)
bennos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.