大数据集中的PostgreSQL简单交叉表(行到列,列到行)
我有一张这样的桌子:大数据集中的PostgreSQL简单交叉表(行到列,列到行),postgresql,pivot,bigdata,crosstab,Postgresql,Pivot,Bigdata,Crosstab,我有一张这样的桌子: CELL day1 day2 day3 day4 ...... day365 1 3,7167 0 0 0,1487 ...... 0,3256 2 0 0 0,2331 0,1461 ...... 1,8765 3 1,431 0,4121 0 1,4321 ...... 0
CELL day1 day2 day3 day4 ...... day365
1 3,7167 0 0 0,1487 ...... 0,3256
2 0 0 0,2331 0,1461 ...... 1,8765
3 1,431 0,4121 0 1,4321 ...... 0
...
...
...
64800
DAY 1 2 3 ...... 64800
day1 3,7167 0 1,431 ...... ......
day2 0 0 0,4121 ...... ......
day3 0 0,2331 0 ...... ......
day4 0,1487 0,1461 1,4321 ...... ......
...
...
...
day365
我想转置我的表,这样我就可以将行作为列,将列作为行。结果如下所示:
CELL day1 day2 day3 day4 ...... day365
1 3,7167 0 0 0,1487 ...... 0,3256
2 0 0 0,2331 0,1461 ...... 1,8765
3 1,431 0,4121 0 1,4321 ...... 0
...
...
...
64800
DAY 1 2 3 ...... 64800
day1 3,7167 0 1,431 ...... ......
day2 0 0 0,4121 ...... ......
day3 0 0,2331 0 ...... ......
day4 0,1487 0,1461 1,4321 ...... ......
...
...
...
day365
我最大的问题是表的大小(365列和64800行)。
如何编写一个不必在输出中定义所需列的查询。有没有一种方法可以在不定义每一列的情况下创建一个表,您能告诉我查询的样子吗
我的第二个问题是,我甚至没有让交叉表在数据子集中工作。
以下查询:
SELECT * FROM crosstab(
'SELECT * FROM 1997_subset ORDER BY 1,2')
AS test("cell" int, "day1" double precision, "day2" double precision, "day3" double precision, "day4" double precision, "day5" double precision)
给我这个错误:
ERROR: invalid source data SQL statement
DETAIL: The provided SQL must return 3 columns: rowid, category, and values.
非常感谢您的帮助,非常感谢 您不能在PostgreSQL中这样做,因为它的输出限制在1600列左右。否则,
tablefunc
模块中的crosstab
函数将对您有所帮助
您需要使用COPY
将数据提取到CSV,然后使用一个可以透视数据的外部工具。看看ETL工具,或者最糟糕的是,您可能需要编写脚本
我刚刚检查了一下,Talend至少可以做一个透视(行/列转置,交叉表)。Pentaho、CloverETL等可能也可以。您可能正在寻找答案()列数限制为250-1600,请参见。为什么需要64800列?这些列代表什么?这些列代表网格中的世界。每一列代表世界的一个地区,每一列都有一度长和一度高。总共是64800。@马吕斯,这很公平,但为什么不创建一个类似(Long、Lat、Day、Value)的表呢?从长远来看,它将更容易使用。如果要将值存储多年,表会发生什么变化?然后您会创建一个新表还是每年创建365列的倍数?