Новая агрегатная функция массива

У меня есть такая таблица:

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
   );
Другие вопросы по тегам