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星型模式透视查询?的主要内容,如果未能解决你的问题,请参考以下文章