我有一张这样的表:
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
是无工作日。)
是否可以聚合这些行为一个包含每个col的总和(如果它是int)?
我的目标是从这样的查询答案中获取:{24,16,16,0,8,0,0}
答案 0 :(得分:2)
假设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
);