Eu tenho um nome de tabela " TABLE_A ( id integer, no integer) ".
Quero somar "não" com grupo por "id" e "soma de não" atual = "soma de não" anterior
Aqui está o meu código:
1/ Criar tabela e inserir dados:
create table table_a (id int, no int);
insert into table_a values(1, 10);
insert into table_a values(1, 20);
insert into table_a values(1, 30);
insert into table_a values(2, 100);
insert into table_a values(2, 200);
insert into table_a values(2, 300);
insert into table_a values(3, 1);
insert into table_a values(3, 2);
insert into table_a values(3, 3);
insert into table_a values(3, 3);
2/ Resultado desejado:
id | sum_of_no
--------------
1 | 60
2 | 660
3 | 669
3/ Minhas soluções (ok):
with t_report_code_temp as
(
select id, sum(no) as t_code
from table_a
group by id
)
select a.id, sum(b.t_code)
from t_report_code_temp a
join t_report_code_temp b on b.id <= a.id
group by a.id
order by 1
Minha pergunta:
Você poderia me dar a melhor maneira de resolver?
De Craig Ringer, ypercube.
Aqui meus testes:
Pergunta de Craig Ringer
consulta do ypercube
Eu vejo a magia da função de janela. Obrigado !
Isso parece um candidato para funções de janela.
Primeiro, calcule as somas per-id e, em seguida, faça uma soma contínua ordenada por ID para obter o resultado final desejado.
Melhorando (?) Na resposta de Craig Ringer. Menos código, mas não tenho certeza se é mais legível ou mais confuso:
Testado no SQL-Fiddle
Você está certo em seu comentário, quando uma função de janela (ou um agregado com
OVER()
) tem umORDER BY
, então a janela padrão é:ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
que produz um total em execução comSUM()
.O fluxo lógico de execução é: