【问题标题】:SQL Query to retrieve table value as column将表值作为列检索的 SQL 查询
【发布时间】:2013-03-31 23:54:22
【问题描述】:

我有一个如下的表格视图:

(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_valuestimestamp 是随机值。

我有 Postgres SQL 9.0

【问题讨论】:

  • 您的列的数据类型丢失。
  • 搜索数据透视表或交叉表查询。

标签: sql postgresql crosstab postgresql-9.0


【解决方案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 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

【讨论】:

  • 运行脚本的权限失败,“psql: FATAL: Peer authentication failed for user”。
  • 请提出替代方案,PIVOT 是否需要事先安装任何脚本?
  • @user1564173:尝试以系统用户postgressudo su postgres运行安装脚本。
  • Postgres安装在定制的linux上,大部分命令无法执行。如果条件不匹配,有没有办法隐藏一行?我希望能够使用 SELECT CASE WHEN attr_name = 'user:name' AND attr_name '%' THEN attr_value END "User Name" FROM table_name;但是这个查询的问题是它显示更多的空行并且不是NULL。
  • @user1564173:如上所述,CREATE EXTENSION 适用于 Postgres 9.1+。对于大多数扩展,您需要超级用户权限才能安装它们。 db-user postgres 是默认超级用户。对于新问题,请提出一个新的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多