在Postgres 9.4中,我有这样一张表:
id extra_col days value
-- --------- --- -----
1 rev 0 4
1 rev 30 5
2 cost 60 6
我希望得到这个透视后的结果。
id extra_col 0 30 60
-- --------- -- -- --
1 rev 4 5
2 cost 6
这在交叉表中使用crosstab简单实现,但我需要以下规格:
- 天数列是动态的。有时候每次增加1、2、3(天),0、30、60天(会计月),有时候是360、720(会计年)。
- 天数范围是动态的。(例如,0..500天对比1..10天)。
- 前两列是静态的(id和extra_col)。
- 所有动态列的返回类型都保持相同的类型(在这个例子中,
integer
)。
以下是我尝试过的解决方案,但都不适用于我:
- 在PostgreSQL中自动创建交叉表列名 - 需要执行两次数据库操作。
- 使用crosstab_hash - 不是动态的。
从我所探索的所有解决方案中,似乎只有一种方法可以在一次数据库操作中实现这个目标,这需要运行相同的查询三次。是否可以将查询作为 CTE
存储在 crosstab
函数内?
SELECT *
FROM
CROSSTAB(
--QUERY--,
$$--RUN QUERY AGAIN TO GET NUMBER OF COLUMNS--$$
)
as ct (
--RUN QUERY AGAIN AND CREATE STRING OF COLUMNS WITH TYPE--
)