2013-05-20 67 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答案不会做你想做的事情。鉴于您的要求水平,这是您可以得到的最佳答案。如果这不是你正在寻找的,你必须更**更具体。 –