我有一张这样的桌子:
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}
我有一张这样的桌子:
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}
假设int[]
并忽略无法解释的x
and 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
);