0

我有一个表格视图,如下所示:

(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

4

1 回答 1

1

表函数模块

您正在寻找“枢轴”或“交叉表”。如果您尚未安装附加模块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 的更多信息。

询问

可能看起来像这样:

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);

我命名了你的 column ts,因为timestamp它是 Postgres 中的一个函数名,不应该用作标识符。

在这些相关答案中找到更多解释和详细信息:
PostgreSQL Crosstab Query
Dynamic Alternative to pivot with CASE and GROUP BY

于 2013-04-01T01:01:46.107 回答