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
107828 次浏览

使用 ORDERBY,如 手动操作中的示例所示:

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

如果使用的是 PostgreSQL 版本 < 9.0,那么:

发信人: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

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

选择 xmlagg (x) FROM (选择 x FROM test ORDER BY y DESC)作为选项卡;

所以你可以这样写:

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子句。

根据 Tom Lane:

... 如果我正确地读取它,OP 希望确保两个聚合函数将以 * 相同 * 未指定的顺序看到数据。我觉得这是个很安全的假设。服务器必须另辟蹊径,才能做出不同的选择,但它没有这样做。

... 因此,没有自己的 ORDERBY 的聚合将按 FROM 子句提供的任何顺序查看行,这是有文档记录的行为。

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

资料来源: PostgreSQL 邮件列表

这样做:

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;