没有聚合函数的Postgresql数据透视行数据

Postgresql pivot row data without aggregate function

我有这个table:

create table student
(
    key serial primary key,
    id int, 
    type_name text,
    updated_by text,
    updated date, 
    text_data text,
    int_data int
); 

样本table,数据为here

一个学生id 同一科目可能有多个行(分数)。我需要对每个学生的每个科目的所有分数进行调整。

我正在尝试使用以下查询来转换数据

select 
    id,
    max(updated_by) as updated_by,
    max(updated) as updated,
    max(case when type_name='Name' then text_data end) as "Name",
    max(case when type_name='Math' then int_data end) as "Math",
    max(case when type_name='English' then int_data end) as "English",
    max(case when type_name='Social' then int_data end) as "Social",
    max(case when type_name='Science' then int_data end) as "Science"
from
    stud 
group by 
    id

但这并没有给出 id 1 的所有标记,而在 Math 主题中有标记 8 和 5。因为我在查询中使用了 max 函数,所以我得到了单个值。

但是好像没有聚合函数我们做不到group_by.

Postgresql 中是否有方法在没有聚合函数的情况下转换数据以获得低于预期的输出

谢谢

你需要什么作为另一个聚合,即 STRING_AGG() 以及 FILTER 子句,例如

SELECT id,
       MAX(text_data) AS "Name",
       STRING_AGG ( int_data::TEXT, ',' ORDER BY key ) FILTER (WHERE type_name='Math') AS "Math",
       STRING_AGG ( int_data::TEXT, ',' ORDER BY key ) FILTER (WHERE type_name='English') AS "English",
       STRING_AGG ( int_data::TEXT, ',' ORDER BY key ) FILTER (WHERE type_name='Social') AS "Social",
       STRING_AGG ( int_data::TEXT, ',' ORDER BY key ) FILTER (WHERE type_name='Science') AS "Science"
  FROM stud 
 GROUP BY id

Demo