my_data
table é assim (exemplo de uma linha):
total_cost | total_exp | ind1 | ind2 | ind3 | flag
------------+-----------+------+------+------+------
1000 | 2000 | A | A1 | A2 | F
E eu tenho uma função assim:
CREATE OR REPLACE FUNCTION create_my_aggregation() RETURNS VOID AS $$
DECLARE
import_date date;
BEGIN
FOR import_date IN
SELECT generate_series('2005-01-01'::date, '2015-04-01'::date, '1 month'::Interval)
LOOP
insert into my_timeseries
select
-- ind1 as ind,
-- ind2 as ind,
ind3 as ind,
import_date,
-- size
array_agg(total_cost) filter(where flag = 'F' and total_exp > 0) as f_cost_a,
array_agg(total_cost) filter(where flag = 'S' and total_exp > 50) as s_cost_a,
array_agg(total_cost) filter(where flag = 'D' and total_exp > 100) as d_cost_a,
array_agg(total_cost) filter(where flag = 'T' and total_exp > 20) as t_cost_a,
from my_data
where date_trunc('month', date_of_transfer) = date_trunc('month', import_date)
-- group by ind1, import_date;
-- group by ind2, import_date;
group by ind3, import_date;
END LOOP;
END
$$ LANGUAGE plpgsql;
O resultado esperado é uma agregação de matriz com as agregações ind1,ind2,ind3
renomeadas ind
e relativas.
O problema com essas funções é que eu tenho que mudar (e executar 3 vezes) select ind1 as ind....group by ind1,import_date
.
Existe uma maneira de unificá-lo de uma só vez?
Usar
grouping sets
:Mas foi introduzido apenas na versão 9.5 .
Você pode usar
lateral
para desarticular as colunasind1
e em uma única coluna e especificar a última como critério de agrupamentoind2
:ind3
Que tal juntar essas colunas? É aquilo que você precisa?