declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
a seleção acima retorna o seguinte.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Como obtenho o seguinte:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Respostas:
Exemplo de SQL Fiddle
Resultado
Edit: esta é uma solução generalizada que funcionará na maioria das plataformas db. Quando houver uma solução melhor disponível para sua plataforma específica (por exemplo, da Gareth), use-a!
fonte
A versão mais recente do SQL Server (2012) permite o seguinte.
ou
Isso é ainda mais rápido. A versão particionada é concluída em 34 segundos em mais de 5 milhões de linhas para mim.
Agradecemos a Peso, que comentou sobre o segmento da Equipe SQL mencionado em outra resposta.
fonte
ROWS UNBOUNDED PRECEDING
vez deROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Não ficou imediatamente óbvio para mim se ele iria trabalhar, mas ele fez :-)Para o SQL Server 2012 em diante, pode ser fácil:
porque a
ORDER BY
cláusula para,SUM
por padrão, significa oRANGE UNBOUNDED PRECEDING AND CURRENT ROW
quadro da janela ("Comentários gerais" em https://msdn.microsoft.com/en-us/library/ms189461.aspx )fonte
Uma versão CTE, apenas por diversão:
Devoluções:
fonte
Vamos primeiro criar uma tabela com dados fictícios ->
aqui estou entrando na mesma tabela (SELF Joining)
RESULTADO:
aqui vamos nós agora somar o Somevalue de T2 e obteremos o ans
Resultado desejado
Limpar a tabela dummy
fonte
rank()
e outra ordem por cláusula para resolvê-lo.Resposta tardia, mas mostrando mais uma possibilidade ...
A geração de soma acumulada pode ser mais otimizada com o
CROSS APPLY
lógica.Funciona melhor que o
INNER JOIN
&OVER Clause
quando analisado o plano de consulta real ...fonte
set io statistics on
e compare o tempo da CPU e o tempo real.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
fonte
correlated subquery
em todas as linhas do conjunto de resultados, varrendo cada vez mais linhas. Ele não mantém um total em execução e verifica os dados uma vez, como as funções da janela.Há uma implementação CTE muito mais rápida disponível neste excelente post: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
O problema neste encadeamento pode ser expresso assim:
fonte
Você pode usar esta consulta simples para cálculo progressivo:
fonte
Depois que a tabela é criada -
fonte
Acima (Pré-SQL12), vemos exemplos como este: -
Mais eficiente...
fonte
Tente isto
fonte
Tente o seguinte:
fonte
A solução SQL que combina "LINHAS ENTRE PRECEDENTES NÃO LIMITADOS E LINHA ATUAL" e "SUM" fez exatamente o que eu queria alcançar. Muito obrigado!
Se pode ajudar alguém, aqui estava o meu caso. Eu queria acumular +1 em uma coluna sempre que um criador fosse encontrado como "Algum Criador" (exemplo). Caso contrário, não há incremento, mas mostra o resultado do incremento anterior.
Então, este pedaço de SQL:
Permitiu-me obter algo parecido com isto:
Explicação acima: Inicia a contagem de "some maker" com 0, Some Maker é encontrado e fazemos +1. Para o usuário 1, MakerC é encontrado, portanto, não fazemos +1, mas a contagem vertical de Some Maker fica presa a 2 até a próxima linha. O particionamento é por usuário, portanto, quando mudamos de usuário, a contagem acumulada volta a zero.
Estou no trabalho, não quero mérito nesta resposta, apenas agradeça e mostre meu exemplo caso alguém esteja na mesma situação. Eu estava tentando combinar SUM e PARTITION, mas a incrível sintaxe "LINHAS ENTRE PRECEDENTES NÃO LIMITADOS E LINHAS ATUAIS" concluiu a tarefa.
Obrigado! Groaker
fonte
Sem usar qualquer tipo de salário acumulado JOIN para uma pessoa buscar usando a consulta a seguir:
fonte
Para Ex: se você tiver uma tabela com duas colunas, uma é ID e a segunda é número e deseja descobrir a soma acumulada.
fonte