0Pricing
Coding Interview Prep · Aula

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.0 para evitar a divisão inteira.
  • PARTITION BY para obter participações por grupo.
  • Numerador acumulado sobre um denominador do total geral = participação acumulada.
  • CUME_DIST e PERCENT_RANK para 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

  1. Somas acumuladas com molduras de janela
  2. Molduras ROWS versus RANGE
  3. Médias móveis em uma janela deslizante
  4. Distribuição acumulada e percentual do total
← Voltar para Coding Interview Prep