2012-01-22 26 views
0

我想找到一種方法來使用Perl來進一步處理PostgreSQL輸出。如果有更好的方式通過PostgreSQL來做到這一點,請告訴我。我基本上需要選擇文件中的某些列(Realtime,Value)來連接某些列以創建一行,同時保留ID和CAT。Perl + PostgreSQL--選擇性列到行轉置

第一次發佈,所以請讓我知道,如果我錯過了任何東西。

輸入:

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

你可以像這樣(使用數組列)做到這一點最簡單的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; 

然後選擇你想要的一切的輸出表。

+0

謝謝,這固定得很好,沒有錯誤,因爲實時性和價值都是非字符串字段。 –

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 +)創建上午陣列出來的輸入值。


關於1, 2 - I引用該SELECT命令的手冊:

GROUP BY clause

表達可以是輸入列名,或名稱或序數 的輸出列(SELECT列表項)或...

ORDER BY clause

每個表達式可以是名稱或輸出列 的序數(選擇列表項),或

重點礦。所以這只是符號的便利。在SELECT列表中特別適用於複雜表達式。

+0

1,2在當前選擇中代表「第一和第二列」? Tnx –

+0

@CornelGhiban是的,正確的。 – dgw

+0

謝謝!當我意識到問題的一部分是需要升級時,我升級到9.1。我繼承的系統有8.3。文字奇妙。 –