将postgres中的记录分组并拆分成几个新的列系列

时间:2015-12-12 06:20:56

标签: sql postgresql pivot crosstab

我有

形式的数据
-----------------------------|
6031566779420 | 25  | 163698 |
6031566779420 | 50  | 98862  |
6031566779420 | 75  | 70326  |
6031566779420 | 95  | 51156  |
6031566779420 | 100 | 43788  |
6036994077620 | 25  | 41002  |
6036994077620 | 50  | 21666  |
6036994077620 | 75  | 14604  |
6036994077620 | 95  | 11184  |
6036994077620 | 100 | 10506  |
------------------------------

并希望通过将每个系列(25,50,75,95,100)和相应的值视为新系列来创建动态数量的新列。我正在寻找的目标输出是

--------------------------
| 25    | 163698 | 41002 |
| 50    | 98862  | 21666 |
| 75    | 70326  | 14604 |
| 95    | 51156  | 11184 |
| 100   | 43788  | 10506 |
-------------------------- 

我不知道我想要的sql / postgres操作名称是什么,也不知道如何实现它。在这种情况下,数据有2个新列,但我试图制定一个具有许多新列的解决方案,原始查询输出中的数据组也是如此。

[编辑]

感谢array_agg的引用,看起来会有所帮助!我之前应该提到这一点,但我使用Redshift报告了这个版本的Postgres:

PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.1007

它似乎还不支持此功能。

ERROR:  function array_agg(numeric) does not exist
HINT:  No function matches the given name and argument types. You may need to add explicit type casts.
Query failed
PostgreSQL said: function array_agg(numeric) does not exist
Hint: No function matches the given name and argument types. You may need to add explicit type casts.

交叉表是我应该看的转换类型吗?或者是其他东西?再次感谢。

2 个答案:

答案 0 :(得分:1)

我在这里使用了array_agg()

select idx,array_agg(val) 
from t
group by idx

这将产生如下结果:

idx array_agg      
--- -------------- 
25  {163698,41002} 
50  {98862,21666}  
75  {70326,14604}  
95  {11184,51156}  
100 {43788,10506}  

如您所见,第二列是两个值(列idx)的数组,对应于列idx

以下选择查询将为您提供两个单独的列

的结果

Method : 1

 SELECT idx
       ,col [1] col1 --First value in the array
       ,col [2] col2 --Second vlaue in the array
FROM (
    SELECT idx
        ,array_agg(val) col
    FROM t
    GROUP BY idx
    ) s

<强> Method : 2

SELECT idx
    ,(array_agg(val)) [1] col1 --First value in the array
    ,(array_agg(val)) [2] col2 --Second vlaue in the array
FROM t
GROUP BY idx

<强> Result:

idx col1   col2  
--- ------ ----- 
25  163698 41002 
50  98862  21666 
75  70326  14604 
95  11184  51156 
100 43788  10506 

答案 1 :(得分:0)

您可以使用array_agg功能。假设您的列名为ABC

SELECT B, array_agg(C)
FROM table_name
GROUP BY B

将以数组形式输出。这与您在简单查询中获取变量列的距离非常接近。如果您确实需要变量列,请考虑定义PL/pgSQL procedure以将数组转换为列。