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
这是我的 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