大数据集中的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列的倍数?