新的数组聚合函数

时间:2013-05-20 14:51:28

标签: sql arrays postgresql aggregate-functions unnest

我有一张这样的表:

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是无工作日。)
是否可以聚合这些行为一个包含每个col的总和(如果它是int)?

我的目标是从这样的查询答案中获取:{24,16,16,0,8,0,0}

1 个答案:

答案 0 :(得分: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}

即将推出的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
   );