0Pricing
Coding Interview Prep · Aula

Médias móveis em uma janela deslizante

Calcule médias móveis de N períodos com BETWEEN PRECEDING e CURRENT ROW.

Médias móveis em uma janela deslizante é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 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 a Média Móvel

Os analistas ouvem esta pergunta o tempo todo: "Calcule uma média móvel de 7 dias da receita." Uma média móvel (ou deslizante) suaviza dados diários ruidosos calculando a média de cada ponto com seus vizinhos recentes.

A resposta adequada para uma entrevista é uma função AVG em janela com uma moldura deslizante explícita. A habilidade principal é escolher os limites da moldura para que a janela deslize corretamente ao longo da ordenação.

O Padrão Fundamental

Uma média móvel é AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW). A moldura desliza: em cada linha, ela cobre a linha atual e as n linhas anteriores.

Para uma janela de 7 dias em linhas diárias, volte 6 linhas e inclua a linha atual, obtendo 7 linhas no total. Esse erro de uma unidade é o engano mais comum que os entrevistadores identificam.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS moving_avg_7d
FROM daily_sales;

Contando Corretamente o Tamanho da Janela

O tamanho da janela é igual a preceding + 1 (o +1 é a linha atual). Portanto:

  • janela de 3 linhas: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  • janela de 7 linhas: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  • janela de 30 linhas: ROWS BETWEEN 29 PRECEDING AND CURRENT ROW

Diga essa aritmética em voz alta em uma entrevista para que a banca perceba que você está sendo cuidadoso, e não chutando.

Janelas Centralizadas versus Retroativas

O exemplo acima é uma média retroativa: ela olha apenas para trás, portanto é causal e segura para painéis de previsão.

Uma média centralizada olha para os dois lados, por exemplo, ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING para uma janela centralizada de 7 linhas. Janelas centralizadas suavizam de modo mais simétrico, mas não podem ser calculadas em tempo real para as linhas mais recentes. Mencione qual delas o caso de uso exige.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
  ) AS centered_avg_7
FROM daily_sales;

O Efeito das Extremidades da Janela

Bem no início dos dados, a janela completa ainda não existe. Para a linha 1 de uma média móvel retroativa de 7 dias, há apenas 1 linha disponível, portanto AVG calcula a média usando somente esse valor.

Isso significa que as primeiras linhas exibem uma média de "aquecimento" calculada sobre menos linhas. Os entrevistadores perguntam como lidar com isso. Há duas opções: aceitar a janela parcial ou ocultar as primeiras linhas exigindo uma contagem completa.

Suprimindo Janelas Parciais

Se a área de negócio quiser NULL até que uma janela completa esteja disponível, use COUNT(*) na mesma moldura e deixe as janelas curtas em branco com uma expressão CASE.

Esse é um detalhe refinado que mostra que você pensou na correção nas extremidades, algo que muitos candidatos deixam passar.

SELECT
  sale_date,
  CASE WHEN COUNT(*) OVER w = 7
       THEN AVG(amount) OVER w
  END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

Reutilizando uma Moldura com WINDOW

A consulta anterior usou uma cláusula WINDOW nomeada. Quando a mesma moldura aparece várias vezes, defini-la uma vez como WINDOW w AS (...) e fazer referência a OVER w mantém a consulta DRY e legível.

Postgres, MySQL 8 e SQL Server oferecem suporte a janelas nomeadas. Usar uma em uma entrevista demonstra familiaridade além de simplesmente copiar e colar funções de janela.

SELECT
  sale_date,
  AVG(amount) OVER w AS avg_7d,
  SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

Armadilha de Dias do Calendário versus Linhas

Uma armadilha sutil: se a tabela tiver dias ausentes, ROWS 6 PRECEDING abrangerá as últimas 7 linhas registradas, o que pode cobrir mais de 7 dias do calendário.

Para uma verdadeira média de 7 dias baseada no calendário que respeite as lacunas, use RANGE com um deslocamento de intervalo ou faça primeiro uma junção com uma série completa de datas para que cada dia tenha uma linha. Mencionar essa distinção é exatamente a ideia de ROWS versus RANGE da lição anterior.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
  ) AS calendar_avg_7d
FROM daily_sales;

Médias Móveis por Grupo

Assim como os totais acumulados, as médias móveis geralmente precisam ser reiniciadas por entidade. Adicione PARTITION BY para que cada produto ou loja tenha sua própria janela móvel, sem atravessar os grupos.

A moldura e a ordenação operam de forma independente dentro de cada partição, portanto as primeiras linhas de cada grupo iniciam corretamente seu próprio aquecimento.

SELECT
  product_id,
  sale_date,
  AVG(amount) OVER (
    PARTITION BY product_id
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS product_ma_7d
FROM daily_sales;

Suavização em Ação

Por que fazer isso? A receita diária é irregular; uma média móvel revela a tendência. Uma resposta comum de analista combina o valor bruto com sua linha suavizada para que o painel mostre tanto o sinal quanto o ruído.

Você também pode comparar uma média móvel curta com uma longa (por exemplo, 7 dias contra 30 dias) para detectar impulso, o equivalente em SQL a um cruzamento de médias móveis.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)  AS ma_7,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;

Lista de Verificação para a Entrevista

Para responder bem a uma pergunta sobre médias móveis, aborde:

  • AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).
  • Tamanho da janela = linhas anteriores + 1.
  • Escolha entre janela retroativa e centralizada.
  • Aquecimento da janela parcial e como suprimi-lo.
  • ROWS versus RANGE quando faltam dias.
  • PARTITION BY para reiniciar por entidade.

Verificação Rápida

Escolha a moldura para uma média móvel retroativa de 7 dias em linhas diárias.

Resumo: Médias Móveis

Uma média móvel é AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW), em que o tamanho da janela é o número de linhas anteriores mais um. Escolha uma janela retroativa ou centralizada de acordo com o caso de uso, trate as linhas de aquecimento com uma verificação usando COUNT e mude para um intervalo RANGE quando as lacunas do calendário forem importantes.

Reinicie por entidade com PARTITION BY e reutilize molduras com um WINDOW nomeado. Em seguida, transformaremos somas acumuladas em percentuais com a participação acumulada do total.

Perguntas Frequentes

A aula “Médias móveis em uma janela deslizante” é grátis?

Sim — o texto completo de “Médias móveis em uma janela deslizante” é 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 “Médias móveis em uma janela deslizante”?

Calcule médias móveis de N períodos com BETWEEN PRECEDING e CURRENT ROW. 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 3 de 4.

Quanto tempo leva a aula “Médias móveis em uma janela deslizante”?

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