Somas acumuladas com molduras de janela
Crie um total acumulado usando SUM OVER com uma moldura ordenada.
Somas acumuladas com molduras de janela é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
A pergunta sobre o total acumulado
Quase toda entrevista para analista inclui alguma versão de: "Mostre-me a receita acumulada ao longo do tempo." Um total acumulado é uma soma que cresce linha a linha, acumulando tudo desde o início até a linha atual.
Antes da existência das funções de janela, os candidatos resolviam isso com uma junção da tabela consigo mesma, que era lenta, ou com uma subconsulta correlacionada. A resposta moderna esperada é SUM(...) OVER (ORDER BY ...). Conhecer a versão com moldura de janela indica que você entende SQL escrito a partir de aproximadamente 2012.
Anatomia de uma soma de janela ordenada
Um total acumulado é apenas uma agregação transformada em uma função de janela. Você mantém SUM(amount), mas adiciona uma cláusula OVER com um ORDER BY.
O ORDER BY dentro de OVER é o que o torna acumulado: ele informa ao SQL para acumular as linhas nessa sequência. Sem um ORDER BY, SUM totalizaria a partição inteira para cada linha, em vez de crescer.
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
ORDER BY sale_date;Por que ORDER BY implica uma moldura
Aqui está o detalhe que os entrevistadores adoram explorar: quando você adiciona ORDER BY a uma agregação de janela, o SQL aplica uma moldura padrão de RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Esse padrão é exatamente o que produz um total acumulado: todas as linhas desde o início da partição até, inclusive, a linha atual. Se você entende esse padrão, entende por que a soma acumulada "simplesmente funciona".
Tornando a moldura explícita
Você pode escrever a moldura manualmente. Essas duas consultas retornam o mesmo resultado, mas a versão explícita mostra ao entrevistador que você sabe o que acontece nos bastidores.
Escrever ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW é a forma explícita mais segura para um total acumulado, porque conta linhas físicas e evita as surpresas do agrupamento por valor de RANGE (abordadas na próxima lição).
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;Exemplo prático: vendas diárias
Imagine quatro dias de vendas: seg. 100, ter. 50, qua. 200, qui. 75. O total acumulado cresce da esquerda para a direita.
- Seg.: 100
- Ter.: 100 + 50 = 150
- Qua.: 150 + 200 = 350
- Qui.: 350 + 75 = 425
A última linha sempre equivale ao total geral. Essa é uma verificação rápida de consistência que você pode mencionar em uma entrevista: o último valor do total acumulado deve corresponder a SUM(amount) sobre todo o conjunto.
Reiniciando por grupo com PARTITION BY
As perguntas reais geralmente pedem um total acumulado por cliente ou por região, e não um único total global. Adicione PARTITION BY e a acumulação será reiniciada no início de cada partição.
O modelo mental é o seguinte: PARTITION BY divide as linhas em grupos independentes, e o ORDER BY com a moldura é executado separadamente dentro de cada grupo.
SELECT
customer_id,
sale_date,
amount,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY sale_date
) AS customer_running_total
FROM sales;A armadilha do critério de desempate
Se duas linhas compartilham o mesmo valor de ORDER BY (duas vendas na mesma data), a moldura padrão RANGE as trata como pares e atribui a elas o mesmo total acumulado, incluindo os dois valores.
Se você precisar de um incremento estritamente linha a linha mesmo em caso de empate, mude para uma moldura ROWS e adicione um critério de desempate exclusivo ao ORDER BY, como sale_date, id. Os entrevistadores incluem datas duplicadas de propósito para verificar se você percebe.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date, id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;Total acumulado de uma contagem
A lógica acumulativa não se limita a SUM. Qualquer agregação funciona como uma função de janela, portanto você pode criar uma contagem acumulada, uma média acumulada ou um máximo acumulado.
Uma contagem acumulada de pedidos é uma métrica comum de painel: quantos pedidos foram recebidos até agora em cada dia?
SELECT
order_date,
COUNT(*) OVER (
ORDER BY order_date
) AS orders_to_date
FROM orders;A abordagem antiga: subconsulta correlacionada
Às vezes, os entrevistadores pedem que você resolva um total acumulado sem usar funções de janela, para testar seu conhecimento aprofundado. A solução clássica anterior às funções de janela é uma subconsulta correlacionada que recalcula a soma de todas as linhas anteriores.
Ela funciona, mas é O(n ao quadrado): para cada linha, percorre a tabela novamente. Mencione isso para mostrar que você sabe por que as funções de janela a substituíram.
SELECT
s.sale_date,
s.amount,
(SELECT SUM(s2.amount)
FROM sales s2
WHERE s2.sale_date <= s.sale_date) AS running_total
FROM sales s
ORDER BY s.sale_date;Filtragem versus resultado da janela
Uma pergunta de acompanhamento frequente é: "Mostre apenas os dias em que o total acumulado ultrapassou 1000." Você não pode colocar uma função de janela em WHERE, porque a moldura é calculada depois que WHERE é executado.
A solução é calcular o total acumulado em uma CTE ou subconsulta e, em seguida, filtrar a consulta externa. Essa é a mesma regra de encapsulamento que se aplica a todas as funções de janela.
WITH t AS (
SELECT
sale_date,
SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
)
SELECT *
FROM t
WHERE running_total >= 1000;Pontos para mencionar na entrevista
Ao apresentar uma resposta sobre total acumulado, explique estes pontos para obter a pontuação máxima:
SUM OVER (ORDER BY ...)é a forma acumulativa.- Adicionar
ORDER BYcria uma moldura padrão deUNBOUNDED PRECEDINGatéCURRENT ROW. - Use
PARTITION BYpara reiniciar por grupo. - Adicione um critério de desempate exclusivo e uma moldura
ROWSpara evitar a armadilha dos valores duplicados. - Envolva o resultado em uma CTE para filtrá-lo.
Verificação rápida
Teste sua compreensão da moldura padrão.
Recapitulação: somas acumuladas
Um total acumulado é uma agregação de janela ordenada. SUM(amount) OVER (ORDER BY sale_date) acumula as linhas desde o início da partição até a linha atual, graças à moldura implícita de UNBOUNDED PRECEDING até CURRENT ROW.
Reinicie o total por grupo com PARTITION BY, adicione um critério de desempate e uma moldura ROWS para lidar com valores de ordenação duplicados e envolva o resultado em uma CTE sempre que precisar filtrar pelo valor acumulado. Em seguida, vamos dissecar a distinção entre ROWS e RANGE sugerida nesta lição.
Perguntas Frequentes
A aula “Somas acumuladas com molduras de janela” é grátis?
Sim — o texto completo de “Somas acumuladas com molduras de janela” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Somas acumuladas com molduras de janela”?
Crie um total acumulado usando SUM OVER com uma moldura ordenada. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Somas acumuladas com molduras de janela”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Interview Prep?
Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Somas acumuladas com molduras de janela
- Molduras ROWS versus RANGE
- Médias móveis em uma janela deslizante
- Distribuição acumulada e percentual do total