没有聚合函数的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
我有这个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