2013-05-20 99 views
0

我有一個表是這樣的:新陣列聚集函數

id | array 
1 | {8,8,8,x,u,x,x} 
2 | {8,8,8,x,8,x,x} 
...|... 
n | {8,u,u,x,u,x,x} 

它包含的工作時間每個員工(在陣列的cols是星期幾,ux都是免費工作日內)。
是否有可能將聚合這些行放入一個包含每個列的總和(如果它是一個int)?

我的目標是從查詢的回答是這樣得到:{24,16,16,0,8,0,0}

+1

護理解釋'x'和'你'?您的Postgres版本和正在使用的數據類型?你想聚合* n *行還是隻合併*兩個*? –

+0

我需要聚合n行;數組是由函數'string_to_array'生成的,所以我假設它中的所有數據都是字符串; pgsql版本是9.0 – Vexator

+0

@Vexator:讀取您最後的評論,這正是* Erwin的答案。另外在你的問題中,你說你有一個**表**和一個數組列,現在突然你的數組是一個查詢中的函數調用的結果。請告訴我們你真的有什麼。 –

回答

2

假設int[],而忽略不明原因xu,解決這將是與unnest()row_number()的一種方式,其次是聚集和數組構造。

WITH t(i,a) AS (
    VALUES 
    (1, '{8,8,8,0,0,0,0}'::int[]) 
    ,(2, '{8,8,8,0,8,0,0}') 
    ) 
SELECT ARRAY(
    SELECT sum(elem) 
    FROM (
     SELECT unnest(a) AS elem 
      ,generate_subscripts(a, 1) AS idx 
     FROM t 
    ) sub 
    GROUP BY idx 
    ORDER BY idx 
    ); 

結果:

{16,16,16,0,8,0,0} 

即將到來的Pos​​tgres 9.4(目前是測試版)提供WITH ORDINALITY
PostgreSQL unnest() with element number

簡化事情進一步:

WITH t(i,a) AS (
    VALUES 
    (1, '{8,8,8,0,0,0,0}'::int[]) 
    ,(2, '{8,8,8,0,8,0,0}') 
    ) 
SELECT ARRAY(
    SELECT sum(elem) 
    FROM unnest(a) WITH ORDINALITY AS x (elem, idx) 
    GROUP BY idx 
    ORDER BY idx 
    ); 
+0

謝謝你的回覆,不幸的是它不會爲我工作:/ – Vexator

+1

@Vexator:而不是用'x'和'u'和「* not work *」混淆你的問題,你應該試着說*爲什麼* Erwin's答案不會做你想做的事情。鑑於您的要求水平,這是您可以得到的最佳答案。如果這不是你正在尋找的,你必須更**更具體。 –