0Pricing
SQL Interview Prep · Aula

Molduras ROWS versus RANGE

Entenda a diferença sutil e muito cobrada entre molduras baseadas em linhas e em valores.

Molduras ROWS versus RANGE é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 2 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 distinção que os entrevistadores exploram

Depois que você consegue escrever um total acumulado, a pergunta de acompanhamento natural é: "Qual é a diferença entre ROWS e RANGE em uma moldura de janela?" Essa é uma indicação precisa de conhecimento de nível intermediário. Muitos candidatos usam molduras diariamente sem perceber que as duas palavras-chave se comportam de maneira diferente.

Ambas definem o conjunto de linhas que a agregação considera, mas contam esse conjunto de maneiras fundamentalmente diferentes. Acerte isso e você se destacará.

ROWS conta linhas físicas

ROWS é posicional. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW significa literalmente a linha atual mais as duas linhas físicas diretamente acima dela na sequência ordenada.

Ele não se importa se as linhas vizinhas compartilham o mesmo valor de ORDER BY. Três linhas significam três linhas, ponto final. Essa é a moldura que quase sempre você deseja para médias móveis e totais acumulados estritos.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS rows_sum
FROM sales;

RANGE conta por valor

RANGE é baseado em valores. Ele inclui todas as linhas cujo valor de ORDER BY está dentro de um intervalo lógico do valor da linha atual, e não uma quantidade de linhas.

A consequência mais importante é que, com RANGE, todas as linhas que empatam no valor de ORDER BY são tratadas como um único grupo de pares. Todas recebem a mesma moldura e, portanto, o mesmo resultado.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS range_sum
FROM sales;

O exemplo de empate que revela a diferença

Suponha que duas vendas ocorram em 2024-03-02, com valores 30 e 40, precedidas por uma venda em 2024-03-01 com valor 100.

  • Com RANGE até CURRENT ROW: as duas linhas de 03-02 são pares, portanto ambas mostram 100 + 30 + 40 = 170.
  • Com ROWS até CURRENT ROW: a primeira linha de 03-02 mostra 130 e a segunda mostra 170, porque cada linha amplia a moldura uma posição de cada vez.

Mesmos dados, números diferentes. Essa divergência em caso de empate é o ponto central da pergunta.

Por que o padrão é RANGE

Lembre-se de que OVER (ORDER BY ...) sem uma moldura explícita usa como padrão RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Isso significa que um total acumulado ingênuo usa RANGE silenciosamente. Em chaves de ordenação únicas, ele é idêntico a ROWS, por isso o erro fica oculto. Assim que surgem valores de ordenação duplicados, seu total acumulado agrupa silenciosamente as linhas empatadas. É por isso que engenheiros experientes escrevem ROWS explicitamente.

RANGE Com Deslocamentos Numéricos

RANGE pode aceitar um deslocamento de valor, não apenas UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW sobre uma coluna de data ou numérica inclui cada linha cujo valor esteja a até 7 unidades do valor atual.

Em uma data, isso produz uma janela verdadeira de "últimos 7 dias" que ignora corretamente os dias ausentes, enquanto ROWS 7 PRECEDING selecionaria as 7 linhas anteriores independentemente das lacunas. Conhecer essa nuance é uma resposta forte.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
  ) AS last_7_days
FROM sales;

ROWS Ignora Lacunas

O outro lado da questão: ROWS não tem noção das lacunas dos dados. Se sua tabela de vendas não tiver fins de semana, ROWS BETWEEN 6 PRECEDING AND CURRENT ROW abrangerá 7 dias registrados, o que pode na verdade cobrir duas semanas do calendário.

Portanto, a escolha depende da intenção: últimos N registros significa ROWS; últimas N unidades de valor (dias, dólares) significa RANGE com um deslocamento.

Realidade do Suporte por Dialeto

Uma resposta honesta em uma entrevista menciona as lacunas de suporte:

  • PostgreSQL oferece suporte a RANGE com deslocamentos (desde a v11) e a ROWS por completo.
  • SQL Server oferece suporte a ROWS e RANGE, mas RANGE apenas com UNBOUNDED/CURRENT ROW, não com deslocamentos numéricos.
  • MySQL 8 oferece suporte a ambos, com tipos limitados de deslocamento em RANGE.

Se um deslocamento numérico de RANGE não estiver disponível, você pode simulá-lo com uma autojunção ou um calendário gerado. Mencionar isso demonstra que você conhece as condições reais de produção.

GROUPS: O Terceiro Modo

Existe um terceiro modo de definição da moldura, menos conhecido: GROUPS. Ele conta grupos de linhas empatadas, e não linhas nem valores. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW inclui o grupo de linhas empatadas atual e o anterior.

Ele raramente é necessário, mas mencioná-lo quando perguntarem "existem outros modos de moldura?" demonstra conhecimento real. Há suporte no PostgreSQL 11+ e em alguns outros bancos.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
  ) AS two_day_groups
FROM sales;

Uma Regra de Decisão para Repetir

Resuma todo o assunto em uma frase que você possa dizer em uma entrevista:

"Use ROWS quando quero dizer um número fixo de linhas físicas, use RANGE quando quero dizer um intervalo lógico do valor de ordenação e lembre-se de que os empates fazem com que eles divirjam, porque a RANGE padrão agrupa valores iguais."

Essa única frase responde à pergunta de forma completa e segura.

Comparação Lado a Lado

Colocar as duas molduras na mesma consulta torna a divergência visível. Execute-a em dados com datas duplicadas e compare as duas colunas linha a linha.

Em datas únicas, as colunas coincidem exatamente; em datas empatadas, a coluna RANGE repete o mesmo total entre as linhas empatadas, enquanto a coluna ROWS sobe um passo por vez.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
  SUM(amount) OVER (ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;

Verificação Rápida

Duas linhas empatam no valor de ORDER BY com uma moldura padrão. O que acontece?

Resumo: ROWS versus RANGE

ROWS conta linhas físicas; RANGE conta pelo valor lógico da coluna de ordenação e agrupa os empates como linhas equivalentes. A moldura padrão de OVER (ORDER BY ...) é RANGE, por isso um total acumulado ingênuo pode agrupar valores duplicados de ordenação.

Escolha ROWS para "últimos N registros" e janelas móveis que não são afetadas por lacunas; escolha RANGE com um deslocamento para "últimos N dias/dólares" que respeitem as lacunas. Saber que GROUPS existe é um bônus. Em seguida, aplicaremos a moldura ROWS para criar médias móveis.

Perguntas Frequentes

A aula “Molduras ROWS versus RANGE” é grátis?

Sim — o texto completo de “Molduras ROWS versus RANGE” é 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 “Molduras ROWS versus RANGE”?

Entenda a diferença sutil e muito cobrada entre molduras baseadas em linhas e em valores. 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 2 de 4.

Quanto tempo leva a aula “Molduras ROWS versus RANGE”?

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

  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 SQL Interview Prep