我有一個表是這樣的:新陣列聚集函數
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是星期幾,u
和x
都是免費工作日內)。
是否有可能將聚合這些行放入一個包含每個列的總和(如果它是一個int)?
我的目標是從查詢的回答是這樣得到:{24,16,16,0,8,0,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是星期幾,u
和x
都是免費工作日內)。
是否有可能將聚合這些行放入一個包含每個列的總和(如果它是一個int)?
我的目標是從查詢的回答是這樣得到:{24,16,16,0,8,0,0}
假設int[]
,而忽略不明原因x
和u
,解決這將是與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}
即將到來的Postgres 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
);
謝謝你的回覆,不幸的是它不會爲我工作:/ – Vexator
@Vexator:而不是用'x'和'u'和「* not work *」混淆你的問題,你應該試着說*爲什麼* Erwin's答案不會做你想做的事情。鑑於您的要求水平,這是您可以得到的最佳答案。如果這不是你正在尋找的,你必須更**更具體。 –
護理解釋'x'和'你'?您的Postgres版本和正在使用的數據類型?你想聚合* n *行還是隻合併*兩個*? –
我需要聚合n行;數組是由函數'string_to_array'生成的,所以我假設它中的所有數據都是字符串; pgsql版本是9.0 – Vexator
@Vexator:讀取您最後的評論,這正是* Erwin的答案。另外在你的問題中,你說你有一個**表**和一個數組列,現在突然你的數組是一個查詢中的函數調用的結果。請告訴我們你真的有什麼。 –