admin

在PostgreSQL上使用SQL连接数组中的多行

sql

我有一个像这样构造的表:

oid | identifier | value
1   | 10         | 101
2   | 10         | 102
3   | 20         | 201
4   | 20         | 202
5   | 20         | 203

我想查询此表以得到这样的结果:

identifier | values[]
10         | {101, 102}
20         | {201, 202, 203}

我想不出办法。那可能吗 ?如何 ?

非常感谢你。


阅读 119

收藏
2021-05-10

共1个答案

admin

这是Postgres内置的,因为有几个版本,因此您不再需要定义自己的名称,名称为array_agg()

test=> select array_agg(n) from generate_series(1,10) n group by n%2;
  array_agg   
--------------
 {1,3,5,7,9}
 {2,4,6,8,10}

(这是Postgres 8.4.8)。

请注意,未ORDER BY指定no ,因此结果行的顺序取决于所使用的分组方法(此处为哈希),即未定义。例子:

test=> select n%2, array_agg(n) from generate_series(1,10) n group by (n%2);
 ?column? |  array_agg   
----------+--------------
        1 | {1,3,5,7,9}
        0 | {2,4,6,8,10}

test=> select (n%2)::TEXT, array_agg(n) from generate_series(1,10) n group by (n%2)::TEXT;
 text |  array_agg   
------+--------------
 0    | {2,4,6,8,10}
 1    | {1,3,5,7,9}

现在,我不知道为什么会收到{10,2,4,6,8}{9,7,3,1,5},因为generate_series()应该按顺序发送行。

2021-05-10