带有交叉表的 Postgres 数据透视表
Posted
技术标签:
【中文标题】带有交叉表的 Postgres 数据透视表【英文标题】:Postgres pivot table with crosstab 【发布时间】:2017-05-16 07:37:58 【问题描述】:我有一张类似下一张的桌子:
+------------+---------+---------+---------+
| date | value 1 | value 2 | value 3 |
+------------+---------+---------+---------+
| 01/01/2017 | 263 | 7 | 222 |
| 02/01/2017 | 275 | -9 | 209 |
| 03/01/2017 | 331 | -9 | 243 |
| . | . | . | . |
| . | . | . | . |
| . | . | . | . |
+------------+---------+---------+---------+
我想在 postgres 中创建另一个:
+---------+---------------+------------+------------+
| | 01/01/2017 | 02/01/2017 | 03/01/2017 |
+---------+---------------+------------+------------+
| value 1 | 263 | 275 | 331 |
| value 2 | 7 | -9 | -9 |
| value 3 | 222 | 209 | 243 |
+---------+---------------+------------+------------+
但我的问题是我不知道我会有多少日期,所以我必须使用这样的东西:
SELECT * FROM crosstab(
$$ SELECT value1, date FROM myTable ORDER BY 1 $$,
$$ SELECT m FROM generate_series((select min(date) from myTable) ,(select max(date) from myTable), '1 month'::interval) m $$
) AS (
".." date, ".." date, ".." date, ".." date
);
有人可以帮助我吗?谢谢。
【问题讨论】:
I dont know how many dates I will have
, 所以,如果你有 1000 个日期,那么你期望结果中有 1000 列?
是的,但我永远不会有 1000 列,因为日期的最大数量为 12,一年中的每个月一个。在示例中,dateformat
将是 mm/dd/yyyy。
【参考方案1】:
您的基本问题是 PostgreSQL 需要知道列的样子才能规划查询。因此,您需要返回某种固定列结构。有多种方法可以做到这一点:
-
先查询日期或允许输入日期,然后在 db 客户端中生成您的查询。
将此包装在一个返回引用器的存储过程中
包装在一个存储过程中,该过程返回行的 JSON 表示形式列表。
但无论哪种方式,如果不在某处动态生成查询,您都无法在查询中执行此操作。
【讨论】:
以上是关于带有交叉表的 Postgres 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章