在 Postgres 中按相同的列值将行转换为列
Convert rows to columns by same column value in Postgres
我有一个 table 喜欢:
id name value
--------------------
1 x 100
1 y 200
1 z 300
2 x 10
2 y abc
2 z 001
3 x 1
...
--------------------
我需要将其转换成类似的东西:
id x y z
---------------------
1 100 200 300
2 10 abc 001
3 1 ...
---------------------
名称已确定。我可以进行多个连接,但我正在寻找更优雅的解决方案。
使用在 Postgres 中使用 filter
语法的条件聚合:
select id,
max(value) filter (where name = 'x') as x,
max(value) filter (where name = 'y') as y,
max(value) filter (where name = 'z') as z
from t
group by id;
附加模块 tablefunc 提供 crosstab()
函数的变体,通常速度最快:
SELECT *
FROM crosstab(
'SELECT id, name, value
FROM tbl
ORDER BY 1, 2'
) AS ct (id int, x text, y text, z text);
您的 value
中似乎混合了数字和字符串,所以我选择 text
作为输出。
参见:
- PostgreSQL Crosstab Query
我有一个 table 喜欢:
id name value
--------------------
1 x 100
1 y 200
1 z 300
2 x 10
2 y abc
2 z 001
3 x 1
...
--------------------
我需要将其转换成类似的东西:
id x y z
---------------------
1 100 200 300
2 10 abc 001
3 1 ...
---------------------
名称已确定。我可以进行多个连接,但我正在寻找更优雅的解决方案。
使用在 Postgres 中使用 filter
语法的条件聚合:
select id,
max(value) filter (where name = 'x') as x,
max(value) filter (where name = 'y') as y,
max(value) filter (where name = 'z') as z
from t
group by id;
附加模块 tablefunc 提供 crosstab()
函数的变体,通常速度最快:
SELECT *
FROM crosstab(
'SELECT id, name, value
FROM tbl
ORDER BY 1, 2'
) AS ct (id int, x text, y text, z text);
您的 value
中似乎混合了数字和字符串,所以我选择 text
作为输出。
参见:
- PostgreSQL Crosstab Query