PostgreSQL array_agg命令

Olo*_*Olo 90 postgresql array-agg

表'动物':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;
Run Code Online (Sandbox Code Playgroud)

预期结果:

Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse
Run Code Online (Sandbox Code Playgroud)

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

Tom;Jerry;Kermit, Frog;Mouse,Cat
Run Code Online (Sandbox Code Playgroud)

Fra*_*ens 276

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

SELECT array_agg(a ORDER BY b DESC) FROM table;
Run Code Online (Sandbox Code Playgroud)

  • 注意:`array_agg`中的`ORDER BY`是在PostgreSQL 9中引入的 (36认同)
  • 请注意,这不适用于`array_agg(DISTINCT a ORDER BY b)` (7认同)
  • 假设PostgreSQL 9+,比接受的答案要好得多. (5认同)
  • 用于多列时,您必须添加括号:`array_agg((a, b, c) ORDER BY b)` (3认同)
  • 您能否提供带有 ORDER BY 的示例以供选择: SELECT array_agg(animal_name), array_agg(animal_type) FROM Animals; ? (2认同)

Ulf*_*lfR 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;
Run Code Online (Sandbox Code Playgroud)

然后,array_agg的输入将是无序的,但在两列中都是相同的.如果你愿意,可以ORDER BY在子查询中添加一个子句.


ebk*_*ebk 8

根据汤姆·莱恩的说法:

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

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

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

来源:PostgreSQL 邮件列表