Distribuição acumulada e percentual do total
Calcule percentuais acumulados e a participação no total dentro das partições.
Distribuição acumulada e percentual do total é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 4 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
A Pergunta sobre o Percentual do Total
Uma pergunta clássica em entrevistas sobre relatórios: "Que percentual da receita total cada categoria representa?" e sua variante acumulada: "Qual é a participação acumulada do total?"
O truque é dividir o valor de cada linha por um agregado de janela calculado em toda a partição. Saber que é possível colocar um total geral em uma função de janela, sem uma autojunção, é o conhecimento que está sendo avaliado.
SUM em Janela sem ORDER BY = Total Geral
Aqui está o passo principal: SUM(amount) OVER () com um OVER vazio e sem ORDER BY retorna o total de todo o conjunto de resultados, repetido em cada linha.
Como não há ORDER BY, não existe uma moldura acumulada, portanto a moldura padrão é a partição inteira. Esse total repetido em cada linha é exatamente o denominador necessário para calcular o percentual do total.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;Calculando o Percentual do Total
Divida o valor da linha pelo total geral calculado pela janela e multiplique por 100. Converta para decimal para que a divisão inteira não seja truncada para zero.
Essa consulta de uma única passagem substitui o padrão antigo de usar uma subconsulta para o total e juntá-la novamente às linhas de detalhe. Ela é mais curta, mais rápida e mais clara.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;Armadilha da Divisão Inteira
Uma pegadinha clássica de entrevistas: em muitos bancos de dados, amount / total em colunas inteiras realiza divisão inteira, portanto um resultado menor que 1 se torna 0.
Corrija isso multiplicando primeiro por 100.0 (um literal numérico) ou convertendo um dos operandos: amount::numeric / total. Esquecer isso retorna uma coluna de zeros, algo que os entrevistadores identificam imediatamente.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;Percentual do Total Dentro de um Grupo
Adicione PARTITION BY para tornar a participação de cada linha relativa ao seu grupo, e não à tabela inteira. Por exemplo, o percentual das vendas de cada produto dentro da sua própria região.
O denominador SUM(amount) OVER (PARTITION BY region) agora reinicia por região, portanto os percentuais dentro de cada região somam 100.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;Percentual Acumulado do Total
Combine um numerador acumulado com um denominador fixo para obter uma participação acumulada do total: quanto do total geral foi acumulado até cada linha.
O numerador usa ORDER BY (acumulado), e o denominador usa um OVER () vazio (total geral). A última linha sempre chega a 100%.
SELECT
sale_date,
amount,
ROUND(
100.0 * SUM(amount) OVER (ORDER BY sale_date)
/ SUM(amount) OVER (),
2
) AS running_pct
FROM daily_sales;CUME_DIST: Distribuição Acumulada
O SQL tem uma função integrada para distribuição acumulada: CUME_DIST(). Ela retorna a fração de linhas cujo valor de ORDER BY é menor ou igual ao da linha atual, um número no intervalo (0, 1].
Ao contrário de uma participação acumulada manual de um valor, CUME_DIST trata da posição da linha, respondendo à pergunta "qual proporção das linhas está neste valor ou abaixo dele?" É útil para relatórios no estilo de percentis.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK e Sua Diferença
Uma função semelhante é PERCENT_RANK(), definida como (rank - 1) / (total_rows - 1), variando de 0 a 1.
A distinção importante em entrevistas: CUME_DIST inclui a linha atual no numerador ("neste valor ou abaixo dele"), enquanto PERCENT_RANK é a classificação relativa que começa em 0 para a primeira linha. Elas produzem valores diferentes, e confundi-las é um erro comum.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;Análise de Pareto / 80-20
O percentual acumulado do total permite a análise de Pareto: "quais são os principais clientes que representam 80% da receita?" Ordene os valores em ordem decrescente, calcule a participação acumulada e filtre quando ela ultrapassar 80% pela primeira vez.
Como os resultados de janela não podem aparecer em WHERE, envolva o cálculo em uma CTE e filtre na consulta externa, seguindo a mesma regra de todas as funções de janela.
WITH ranked AS (
SELECT
customer_id,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER () AS running_share
FROM customer_revenue
)
SELECT *
FROM ranked
WHERE running_share <= 0.80;Arredondamento e reconciliação
Atenção: arredondar cada percentual para 2 casas decimais pode fazer a soma da coluna resultar em 99,99 ou 100,01, em vez de exatamente 100. Os entrevistadores podem perguntar como garantir que as partes somem o total.
Respostas comuns: arredondar apenas para exibição, manter a precisão total nos cálculos ou aplicar um ajuste pelo maior resto a uma linha. Identificar o problema é mais importante do que a correção escolhida.
Principais pontos da entrevista
Principais conclusões para explicar em voz alta:
SUM(x) OVER ()sem ORDER BY = total geral em todas as linhas.- Multiplique por
100.0para evitar a divisão inteira. PARTITION BYpara obter participações por grupo.- Numerador acumulado sobre um denominador do total geral = participação acumulada.
CUME_DISTePERCENT_RANKpara distribuição; saiba diferenciá-los.- Envolva a consulta em uma CTE para filtrar por Pareto ou por limiar.
Verificação rápida
Como obter o total geral de todo o conjunto de resultados em todas as linhas?
Recapitulação: distribuição e percentual do total
O percentual do total divide o valor de uma linha por SUM(x) OVER (), o total geral retornado em todas as linhas; multiplique sempre por 100.0 para evitar a divisão inteira e adicione PARTITION BY para obter participações por grupo. Um numerador acumulado sobre um denominador do total geral produz uma participação acumulada que termina em 100%, a base da análise de Pareto.
Para uma distribuição baseada em posição, use CUME_DIST e PERCENT_RANK e lembre-se da ressalva sobre arredondamento e reconciliação. Com isso, você conclui os totais acumulados e as médias móveis.
Perguntas Frequentes
A aula “Distribuição acumulada e percentual do total” é grátis?
Sim — o texto completo de “Distribuição acumulada e percentual do total” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Distribuição acumulada e percentual do total”?
Calcule percentuais acumulados e a participação no total dentro das partições. Você pratica Coding 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 Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding 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 4 de 4.
Quanto tempo leva a aula “Distribuição acumulada e percentual do total”?
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 Coding Interview Prep?
Sim. Cada aula de Coding 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