ARRAY_AGG() 按另一列的值分组

ARRAY_AGG() grouped by another column's values

这是我的 table 如下所示

p_no  type  name  value
------------------------
1     A     Tomy  1
1     A     Nick  2
1     B     Tomy  3
1     B     Nick  4
1     C     Tomy  5
1     C     Nick  4
2     A     Tomy  8
2     A     Nick  7
2     B     Tomy  5
2     B     Nick  4

意思是每个p_no代表一个块,记录人的价值,有两种A, B, C类型(可能还有更多类型)。

我想select一个有他所有类型价值的人

鉴于p_no=1, name=Tomy

A    B    C    D
------------------
1    3    5    ..

我试过了

SELECT p_no, t[1] A, t[2] B/*, t[3] C.....*/
FROM (
    SELECT p_no, ARRAY_AGG(type) FILTER (WHERE name='Tomy') t
    FROM type
    GROUP BY 1
    ORDER BY 1) _unused

但它不能使 ARRAY_AGG() 包含值

我想我需要类似于 ARRAY_AGG('value' GROUP BY 'type')

的东西

是否可以进行这种查询,或者是否有更好的选择?

你的直觉是对的。您想要聚合按 type 排序的 value,因此:

select p_no, t[1] as "A", t[2] as "B", t[3] as "C"
from (
    select p_no, array_agg(value order by type) as t
    from my_table
    where name = 'Tomy' 
    group by p_no
    ) s

db<>fiddle.