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}

它包含每个员工的工作时间(数组中的列是一周中的天数,u并且x是空闲天数)。
是否可以将这些行聚合成一个包含每个 col 的总和的行(如果它是一个 int)?

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

4

1 回答 1

2

假设int[]并忽略无法解释的xand u,解决它的一种方法是使用unnest()and 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(目前为 beta)提供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
   );
于 2013-05-20T15:22:33.737 回答