PostgreSQL array_agg命令

时间:2011-09-06 09:09:44

标签: postgresql array-agg

表'动物':

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

4 个答案:

答案 0 :(得分:249)

使用ORDER BY,例如manual

中的示例
SELECT array_agg(a ORDER BY b DESC) FROM table;

答案 1 :(得分:24)

如果您使用的是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子句。

答案 2 :(得分:1)

根据Tom Lane

<块引用>

... 如果我没看错,OP 希望确保两个聚合函数将以 * 相同 * 未指定的顺序查看数据。我认为这是一个非常安全的假设。服务器将不得不采取不同的方式来做不同的事情,而事实并非如此。

<块引用>

...因此记录的行为是,没有自己的 ORDER BY 的聚合将以 FROM 子句提供的任何顺序查看行。

所以我认为可以假设所有聚合(没有一个使用 ORDER BY)在您的查询中都会以相同的顺序看到输入数据。虽然顺序本身是未指定的(这取决于 FROM 子句提供行的顺序)。

来源:PostgreSQL mailing list

答案 3 :(得分:0)

这样做:

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