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 Coding 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 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 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
RANGEcom deslocamentos (desde a v11) e aROWSpor completo. - SQL Server oferece suporte a
ROWSeRANGE, masRANGEapenas comUNBOUNDED/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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 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 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 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