我有
形式的数据-----------------------------|
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.
交叉表是我应该看的转换类型吗?或者是其他东西?再次感谢。
答案 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
功能。假设您的列名为A
,B
,C
:
SELECT B, array_agg(C)
FROM table_name
GROUP BY B
将以数组形式输出。这与您在简单查询中获取变量列的距离非常接近。如果您确实需要变量列,请考虑定义PL/pgSQL procedure以将数组转换为列。