133

表“动物”:

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

4 回答 4

408

使用 ORDER BY,就像手册中的这个例子:

SELECT array_agg(a ORDER BY b DESC) FROM table;
于 2011-09-06T09:13:13.680 回答
31

如果您使用的是 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在子查询中添加一个子句。

于 2011-09-06T10:18:32.337 回答
4

根据汤姆·莱恩的说法:

...如果我没看错,OP希望确保两个聚合函数将以*相同*未指定的顺序查看数据。我认为这是一个非常安全的假设。服务器必须不遗余力地做不同的事情,但事实并非如此。

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

因此,我认为可以假设查询中的所有聚合(均未使用 ORDER BY)将以相同的顺序查看输入数据。但是顺序本身是未指定的(这取决于 FROM 子句提供行的顺序)。

来源:PostgreSQL 邮件列表

于 2021-01-07T04:37:41.470 回答
1

做这个:

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;
于 2021-02-11T17:08:10.823 回答