2016-01-12 2 views
1

Как эффективно суммировать/суммировать эти массивы в postgresql, учитывая, что я, например. хотите суммировать все целые числа от индекса 2 до индекса 6, в столбце counts и COALESCE null или missing to 0?Как суммировать целочисленный массив для каждого индекса?

table_x: 

ID  Counts 
1  {1, 2, null, 0, null, 5, 8, 10} 
2  {2, 5, 1,  null, 3} 
3  {null, 3, 5,  0, null, 8, 1} 

To result: 

Counts 
{10,6,0,3,13} 

ответ

2

Вы можете использовать unnest, чтобы каждый элемент, индексы фильтра от 2 до 6, вычислить сумму по каждой позиции и объединить все в один массив с помощью array_agg:

WITH cte AS 
(
    SELECT pos, SUM(val::int) AS val 
    FROM table_x 
    ,LATERAL unnest(counts,ARRAY[1,2,3,4,5,6,7,8,9,10]) 
    AS sub(val, pos) 
    WHERE pos BETWEEN 2 AND 6 
    GROUP BY pos 
) 
SELECT array_agg(val ORDER BY pos) AS result 
FROM cte; 

Выход:

"{10,6,0,3,13}" 

EDIT:

Как @a_horse_with_no_name предложен в комментарии вы можете использовать unnest with ordinality:

Если С ORDINALITY указано положение, дополнительный столбец типа BIGINT будет добавлен к результату функции столбцам. В этом столбце числа рядов результирующего набора функций, начиная с 1.

WITH cte AS 
(
    SELECT pos, SUM(val::int) AS val 
    FROM table_x 
    ,LATERAL unnest(counts) with ordinality AS sub(val, pos) 
    WHERE pos BETWEEN 2 AND 6 
    GROUP BY pos 
) 
SELECT array_agg(val ORDER BY pos) 
FROM cte; 
+1

Использованием 'unnest (отсчетов) с ordinality' будет более гибким –

+0

@a_horse_with_no_name хорошего момента. – lad2025

Смежные вопросы