我正在尝试转置一个有两个行名的表。
Postgres文档提到crosstab()
函数只能处理一个行名,但我有两个行名,比如first name和last name。
我的初始表是:
fn | ln | file_type |attribute
--------------------------------
A | 1 | cat1 |abc
A | 2 | cat1 |gth
A | 1 | cat2 |fgh
B | 1 | cat2 |gth
我希望我的最后一个表有两个初始行,并且文件类型被转置
fn | ln | cat1 | cat2
--------------------------------
A | 1 | abc | fgh
A | 2 | gth |
B | 1 | | gth
我还没有找到我需要的功能工具。。。
版本为Postgres 9.3
最佳答案
使用附加模块tablefunc中的crosstab()
。
这里的具体困难是“行名”由两列组成。为了查询的目的,我进行了连接,但没有在末尾显示连接的列。
假设fn
和ln
是NOT NULL
。未测试:
SELECT fn, ln, cat1, cat2
FROM crosstab(
'SELECT fn || ln AS row_name, fn, ln, file_type, attribute
FROM t
ORDER BY fn, ln, file_type'
,$$VALUES ('cat1'::text), ('cat2')$$)
AS t (row_name text, fn text, ln int, cat1 text, cat2 text);
另一个选择是添加一个代理项“row name”,它带有一个类似于
dense_rank()
的窗口函数,并将定义两列视为“额外列”。例子:Postgresql crosstab query with multiple "row name" columns
基础知识:
PostgreSQL Crosstab Query
关于sql - 具有2个(或更多)行名的交叉表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21142765/