Postgresql星型模式透视查询?

Posted

技术标签:

【中文标题】Postgresql星型模式透视查询?【英文标题】:Postgresql star schema pivot query? 【发布时间】:2016-08-24 18:39:24 【问题描述】:

我有一个中型数据库,位于一个星型模式中,有四个星型外部分支。对于我正在评估的一个特定的可视化软件,我需要将此数据库查询到一个 SPSS 文件中,其中一个外部分支以列为轴。我是 PostgreSQL 新手,所以也许我缺少一些简单的方法。

这是一些示例数据(只有 2 个外部分支表 - 态度和人员):

mainTable
id    |   attitudeKey  |    response   |   personKey
1     |       4        |      3        |      2
2     |       1        |      2        |      2
3     |       4        |      1        |      1
4     |       1        |      4        |      1
5     |       5        |      3        |      1

attitudeTable
attitudeKey    |     attitudeName
4              |       happy
1              |       quiet
5              |       grumpy

personTable
personKey      |     personName    |    personAge
1              |        Bob        |       35
2              |        Amy        |       30

And here is what the final result of the query needs to look like:
personKey  |   happy   |   quiet  |   grumpy   |   personName   |   personAge
1          |     1     |    4     |     3      |      Bob       |      35
2          |     3     |    2     |            |      Amy       |      30

我确信有一种方法可以从 SQL 中获取此查询,但我只是没有足够的经验来编写连接和数据透视。任何帮助是极大的赞赏。谢谢。

我应该提到,列的顺序在最终结果中并不重要。

现在我只是在 R 中处理数据,但这非常麻烦,我觉得带有交叉表的简单 SQL 查询会让我的生活变得更轻松。

【问题讨论】:

postgresql 有一个附加模块,其中包含交叉表函数postgresql.org/docs/9.5/static/tablefunc.html 【参考方案1】:

您可以使用交叉表功能来创建数据透视表。 在使用这些示例之前,您需要安装扩展:

创建扩展表函数

您还需要仔细分类您的数据。手册:

在实践中,SQL 查询应始终指定ORDER BY 1,2 以确保输入行正确排序,即具有相同row_name 的值聚集在一起并在行内正确排序。

您需要使用“personKey”和姿态名称对数据进行排序,以便将正确的值放入正确的列中。

之后,您可以执行此查询。 :

select ct."personKey",ct.happy,ct.quiet,ct.grumpy,ct."personName",ct."personAge"
from crosstab($$
select t.person_key,
   p.person_name,
   p.person_age,
   a.attitude_name,
   t.response
from main_table t
 join person_table p on p.person_key = t.person_key
 join attitude_table a on a.attitude_key = t.attitude_key
order by 1,
     case t.attitude_key
       when 4 then 1
       when 1 then 2
       else 3
     end
$$,
$$
select t.attitude_name
from attitude_table t
order by case t.attitude_key
       when 4 then 1
       when 1 then 2
       else 3
     end
$$) 
as ct("personKey" INTEGER, "personName" TEXT,"personAge" INTEGER, happy INTEGER, 
quiet INTEGER, grumpy INTEGER)

【讨论】:

以上是关于Postgresql星型模式透视查询?的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 中提取独特的结果并降低星型模式的成本

Postgresql 如何在 SQL 数据库上透视表

如何使用 postgresql 为数据仓库星型模式制作简单的日维度表?

如何运行从 postgresql 中的函数生成的查询

将非星型模式数据库转换为星型模式数据库

我可以在 PHP/PDO 中使用 PostgreSQL 简单查询模式吗?