我有一个表是这样的:新阵列聚集函数
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
都是免费工作日内)。
是否有可能将聚合这些行放入一个包含每个列的总和(如果它是一个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}
它包含的工作时间每个员工(在阵列的cols是星期几,u
和x
都是免费工作日内)。
是否有可能将聚合这些行放入一个包含每个列的总和(如果它是一个int)?
我的目标是从查询的回答是这样得到:{24,16,16,0,8,0,0}
假设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
);
谢谢你的回复,不幸的是它不会为我工作:/ – Vexator
@Vexator:而不是用'x'和'u'和“* not work *”混淆你的问题,你应该试着说*为什么* Erwin's答案不会做你想做的事情。鉴于您的要求水平,这是您可以得到的最佳答案。如果这不是你正在寻找的,你必须更**更具体。 –
护理解释'x'和'你'?您的Postgres版本和正在使用的数据类型?你想聚合* n *行还是只合并*两个*? –
我需要聚合n行;数组是由函数'string_to_array'生成的,所以我假设它中的所有数据都是字符串; pgsql版本是9.0 – Vexator
@Vexator:读取您最后的评论,这正是* Erwin的答案。另外在你的问题中,你说你有一个**表**和一个数组列,现在突然你的数组是一个查询中的函数调用的结果。请告诉我们你真的有什么。 –