如何使用行的值作为新列重新格式化数据集?
How to reformat a dataset using the values of rows as new columns?
我有一个如下所示的数据集:
id | test_id
---+--------
1 | a
1 | b
1 | u
2 | a
2 | u
3 | a
3 | b
3 | u
我想把它汇总到一个新的 table 中,这样 test_id
就是列名(连同 id),行要么是 1 要么是 0,这取决于是否测试是给那个id的,像这样
id | a | b | u
---+---+---+--
1 | 1 | 1 | 1
2 | 1 | 0 | 1
3 | 1 | 1 | 1
在 Postgres 中有没有一种方法可以像这样重新排列 table?
如果可能的 test_id
数量是固定的并且已知,最简单的方法是使用如下条件表达式:
select
id,
max(case when test_id = 'a' then 1 else 0 end) as a,
max(case when test_id = 'b' then 1 else 0 end) as b,
max(case when test_id = 'u' then 1 else 0 end) as u
from your_table
group by id
order by id
如果 test_id
值未知并且可能会有所不同,那么您需要使用动态 sql 来生成查询。
一组给定的 test_id
的实际交叉表(“枢轴”)解决方案:
SELECT id
, COALESCE(a, 0) AS a
, COALESCE(b, 0) AS b
, COALESCE(u, 0) AS u
FROM crosstab('SELECT id, test_id, 1 AS val FROM tbl ORDER BY 1,2'
, $$VALUES ('a'), ('b'), ('u')$$
) AS t (id int, a int, b int, u int);
对于 test_id
的动态集,您需要在第一个查询中构建语句并在第二个查询中执行它。或者你 return 数组。
与此类似:
关于 crosstab()
的基础知识(阅读此内容 如果您是新手!):
- PostgreSQL Crosstab Query
备选方案:
我有一个如下所示的数据集:
id | test_id
---+--------
1 | a
1 | b
1 | u
2 | a
2 | u
3 | a
3 | b
3 | u
我想把它汇总到一个新的 table 中,这样 test_id
就是列名(连同 id),行要么是 1 要么是 0,这取决于是否测试是给那个id的,像这样
id | a | b | u
---+---+---+--
1 | 1 | 1 | 1
2 | 1 | 0 | 1
3 | 1 | 1 | 1
在 Postgres 中有没有一种方法可以像这样重新排列 table?
如果可能的 test_id
数量是固定的并且已知,最简单的方法是使用如下条件表达式:
select
id,
max(case when test_id = 'a' then 1 else 0 end) as a,
max(case when test_id = 'b' then 1 else 0 end) as b,
max(case when test_id = 'u' then 1 else 0 end) as u
from your_table
group by id
order by id
如果 test_id
值未知并且可能会有所不同,那么您需要使用动态 sql 来生成查询。
一组给定的 test_id
的实际交叉表(“枢轴”)解决方案:
SELECT id
, COALESCE(a, 0) AS a
, COALESCE(b, 0) AS b
, COALESCE(u, 0) AS u
FROM crosstab('SELECT id, test_id, 1 AS val FROM tbl ORDER BY 1,2'
, $$VALUES ('a'), ('b'), ('u')$$
) AS t (id int, a int, b int, u int);
对于 test_id
的动态集,您需要在第一个查询中构建语句并在第二个查询中执行它。或者你 return 数组。
与此类似:
关于 crosstab()
的基础知识(阅读此内容 如果您是新手!):
- PostgreSQL Crosstab Query
备选方案: