我有一个像这样构造的表:
oid | identifier | value
1 | 10 | 101
2 | 10 | 102
3 | 20 | 201
4 | 20 | 202
5 | 20 | 203
Run Code Online (Sandbox Code Playgroud)
我想查询此表以获得如下结果:
identifier | values[]
10 | {101, 102}
20 | {201, 202, 203}
Run Code Online (Sandbox Code Playgroud)
我无法想办法做到这一点.那可能吗 ?怎么样 ?
非常感谢你.
peu*_*feu 64
这是一个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}
Run Code Online (Sandbox Code Playgroud)
(这是Postgres 8.4.8).
请注意,未ORDER BY
指定,因此结果行的顺序取决于所使用的分组方法(此处为散列),即未定义.例:
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}
Run Code Online (Sandbox Code Playgroud)
现在,我不知道为什么你{10,2,4,6,8}
和{9,7,3,1,5}
的,因为generate_series()
应该按顺序发送行.
Joh*_*iss 16
你必须创建一个聚合函数,例如
CREATE AGGREGATE array_accum (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
Run Code Online (Sandbox Code Playgroud)
然后
SELECT identifier, array_accum(value) AS values FROM table GROUP BY identifier;
Run Code Online (Sandbox Code Playgroud)
HTH
简单的例子:每门课程都有很多课,所以如果我运行下面的代码:
SELECT
lessons.course_id AS course_id,
array_agg(lessons.id) AS lesson_ids
FROM lessons
GROUP BY
lessons.course_id
ORDER BY
lessons.course_id
Run Code Online (Sandbox Code Playgroud)
我会得到下一个结果:
SELECT
lessons.course_id AS course_id,
array_agg(lessons.id) AS lesson_ids
FROM lessons
GROUP BY
lessons.course_id
ORDER BY
lessons.course_id
Run Code Online (Sandbox Code Playgroud)
这是请求输出的代码。
select identifier, array_agg(value)
from (
values
(1 , 10 , 101),
(2 , 10 , 102),
(3 , 20 , 201),
(4 , 20 , 202),
(5 , 20 , 203)
) as tab (oid, identifier, value)
group by identifier
order by identifier;
Run Code Online (Sandbox Code Playgroud)