PostgreSQL简单Crosstable(在大数据集中行到列和列到行)

时间:2015-10-12 08:32:30

标签: 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
...
...
...
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.

非常感谢帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

你不能在PostgreSQL中这样做,因为它在输出中限制在大约1600列。否则,crosstab模块中的tablefunc函数会对您有所帮助。

您需要使用COPY将数据提取到CSV,然后使用可以转动数据的外部工具。看看ETL工具,或者最糟糕的是,您可能需要编写脚本。

我刚检查过,Talend至少可以做一个转轴(行/列转置,交叉表)。 Pentaho,CloverETL等也可能。