我有一个表格视图如下:
(SELECT * FROM session_log_detail)
![Raw Data from table session_log_detail][1]
attr_name attr_value timestamp
A 123 1:20:45
B 234 1:20:45
C 567 1:20:45
D 234 1:20:45
A 098 2:58:20
B 478 2:58:20
" " "
我想要检索的数据如下:
A B C D
123 234 567 234
098 478
每行的时间戳值应相等,如果更改,则需要在下一行。 attr_values
和timestamp
是随机值。
我有Postgres SQL 9.0
。
答案 0 :(得分:1)
您正在寻找“pivot”或“crosstab”。如果尚未安装附加模块tablefunc,请为每个数据库安装一次。在PostgreSQL 9.1+中,这已简化为:
CREATE EXTENSION tablefunc;
在旧版本(包括9.0)中,您必须使用以下命令从shell运行安装脚本:
psql -d dbname -f SHAREDIR/contrib/tablefunc.sql
对于Debian下的9.0版本,这将是:
psql -d dbname -f /usr/share/postgresql/9.0/contrib/tablefunc.sql
Postgres 9.0 in the fine manual的更多信息。
看起来像这样:
SELECT * FROM crosstab(
'SELECT ts, attr_name, attr_value
FROM session_log_detail
ORDER BY 1,2'
,$$VALUES ('A'::text), ('B'), ('C'), ('D')$$)
AS tbl ("ts" text, "A" int, "B" int, "c" int, "D" int);
我将您的列命名为ts
,因为timestamp
是Postgres中的函数名称,不应该用作标识符。
在这些相关答案中找到更多解释和详细信息:
PostgreSQL Crosstab Query
Dynamic alternative to pivot with CASE and GROUP BY