如何使用 Postgres SQL 将行转换为列?
How to transform rows to columns using Postgres SQL?
我有以下结构的数据
期望输出
SELECT customer_id,
MAX(CASE WHEN name='age' THEN value ELSE NULL END) AS age,
MAX(CASE WHEN name='marketing_consent' THEN value ELSE NULL END) AS marketing_consent,
MAX(CASE WHEN name='gender' THEN value ELSE NULL END) AS gender
FROM table
GROUP BY customer_id;
您只需按 customer_id 分组并在其自己的列中挑选出每个值。出于语法原因,您需要在各种值列上使用聚合函数,这就是每列都有一个 Max 函数的原因。
请注意,以规范化方式存储数据当然会更好。此外,对于较新版本的 postgres,您可以使用 filter 而不是 case,我发现它更具可读性。
Postgres(从 9.4 开始)支持条件聚合的 filter
语法。所以我会推荐:
SELECT customer_id,
MAX(value) FILTER (WHERE name = 'age') as age,
MAX(value) FILTER (WHERE name = 'marketing_consent') as marketing_consent,
MAX(value) FILTER (WHERE name = 'gender') as gender
FROM t
GROUP BY customer_id
我有以下结构的数据
期望输出
SELECT customer_id,
MAX(CASE WHEN name='age' THEN value ELSE NULL END) AS age,
MAX(CASE WHEN name='marketing_consent' THEN value ELSE NULL END) AS marketing_consent,
MAX(CASE WHEN name='gender' THEN value ELSE NULL END) AS gender
FROM table
GROUP BY customer_id;
您只需按 customer_id 分组并在其自己的列中挑选出每个值。出于语法原因,您需要在各种值列上使用聚合函数,这就是每列都有一个 Max 函数的原因。
请注意,以规范化方式存储数据当然会更好。此外,对于较新版本的 postgres,您可以使用 filter 而不是 case,我发现它更具可读性。
Postgres(从 9.4 开始)支持条件聚合的 filter
语法。所以我会推荐:
SELECT customer_id,
MAX(value) FILTER (WHERE name = 'age') as age,
MAX(value) FILTER (WHERE name = 'marketing_consent') as marketing_consent,
MAX(value) FILTER (WHERE name = 'gender') as gender
FROM t
GROUP BY customer_id