Новая агрегатная функция массива
У меня есть такая таблица:
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
дни без работы).
Можно ли объединить эти строки в одну, содержащую сумму каждого столбца (если это int)?
Моя цель - получить ответ на запрос следующим образом: {24,16,16,0,8,0,0}
1 ответ
Если предположить, 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 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
);