Perl + PostgreSQL--选择列到行转置

时间:2012-01-22 03:31:24

标签: perl postgresql

我正试图找到一种方法来使用Perl来进一步处理PostgreSQL输出。如果有更好的方法通过PostgreSQL做到这一点,请告诉我。我基本上需要在文件中选择某些列(Realtime,Value)来连接某些列以创建一行,同时保留ID和CAT。

第一次发帖,所以如果我错过任何内容,请告诉我。

输入:

ID  CAT   Realtime  Value
A   1    time1       55
A   1    time2       57
B   1    time3       75
C   2    time4       60
C   3    time5       66
C   3    time6       67

输出:

ID  CAT  Time                   Values
A   1    time 1,time2           55,57
B   1    time3                  75
C   2    time4                  60
C   3    time5,time6            66,67

2 个答案:

答案 0 :(得分:2)

你可以在Postgres中最简单地做到这一点(使用数组列)

CREATE TEMP TABLE output AS SELECT
  id, cat, ARRAY_AGG(realtime) as time, ARRAY_AGG(value) as values
  FROM input GROUP BY id, cat;

然后从输出表中选择您想要的任何内容。

答案 1 :(得分:2)

SELECT id
     , cat
     , string_agg(realtime, ',') AS realtimes
     , string_agg(value, ',') AS values
FROM   input
GROUP  BY 1, 2
ORDER  BY 1, 2;

string_agg()需要PostgreSQL 9.0或更高版本,并将所有值连接到分隔符分隔的字符串 - 而array_agg()(v8.4 +)从输入值中创建am数组。


关于 1, 2 - 我在SELECT命令上引用手册:

GROUP BY clause

  

表达式可以是输入列名称,也可以是名称或序号   输出列(SELECT列表项)或...

ORDER BY clause

  

每个表达式可以是输出列的名称或序号   (选择列表项)或

强调我的。所以这只是符号方便。特别方便的是SELECT列表中的复杂表达式。