N linhas consecutivas que atendem a uma condição
O padrão clássico de janela com “três dias consecutivos com vendas acima de X”.
N linhas consecutivas que atendem a uma condição é uma aula grátis de SQL 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 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.
Um clássico do LeetCode
Este é um dos problemas de SQL mais frequentes em entrevistas: "Encontre todas as datas com pelo menos três dias consecutivos em que as vendas excederam um limite," ou o problema favorito do LeetCode: "informe o estádio com 3 ou mais linhas consecutivas de público acima de 100."
A estrutura é sempre a mesma: uma linha só atende à condição se estiver dentro de uma sequência de N linhas consecutivas que atendem à condição. Esta lição apresenta duas soluções simples e a armadilha que pega a maioria dos candidatos.
Os dados de exemplo
Usaremos uma tabela diária de sales. A condição é amount > 100. Devemos retornar todos os dias que pertençam a uma sequência de 3 ou mais dias consecutivos do calendário que atendam à condição.
sale_date— uma linha por diaamount— total de vendas nesse dia
Detalhe importante: as linhas devem ser consecutivas na sequência e, nas versões baseadas em datas, também consecutivas no calendário.
SELECT * FROM sales ORDER BY sale_date;
-- sale_date | amount
-- 2024-03-01 | 120
-- 2024-03-02 | 150
-- 2024-03-03 | 130
-- 2024-03-04 | 90
-- 2024-03-05 | 200Abordagem 1: filtrar e depois formar ilhas
A abordagem robusta é: primeiro manter somente as linhas que atendem à condição, depois agrupar as linhas restantes em ilhas consecutivas e, por fim, manter as ilhas cujo comprimento seja pelo menos N.
O primeiro passo é o filtro WHERE. O segundo reutiliza a âncora de lacunas e ilhas. Como filtramos primeiro, uma ilha aqui significa "uma sequência de dias consecutivos que atendem à condição".
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;Ancorando as sequências que atendem à condição
Numere as linhas que atendem à condição por data e faça a subtração para obter a âncora da ilha. As linhas consecutivas no calendário e que atendem à condição compartilharão uma âncora; qualquer dia que não atenda à condição foi removido, interrompendo a sequência exatamente onde deveria.
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;Mantendo ilhas longas o suficiente
Agrupe pela âncora, conte as linhas e mantenha somente os grupos com COUNT(*) >= 3. Se o entrevistador quiser recuperar as datas individuais que atendem à condição, faça uma junção entre as âncoras mantidas e as linhas numeradas.
WITH qualifying AS (
SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
),
islands AS (
SELECT sale_date - rn AS grp, COUNT(*) AS len
FROM numbered
GROUP BY sale_date - rn
HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;Abordagem 2: janela deslizante de COUNT
Uma abordagem mais elegante quando N é pequeno e fixo é usar um quadro de janela para contar quantas das linhas vizinhas também atendem à condição. Se alguma janela de N linhas consecutivas que contenha esta linha atender inteiramente à condição, a linha fará parte do resultado.
Primeiro adicione um sinalizador booleano e depois some esse sinalizador em intervalos deslizantes.
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;Somando em três intervalos
Para uma sequência de exatamente 3, uma linha que atende à condição fará parte do resultado se a janela de 3 linhas que termina nela, está centralizada nela ou começa nela somar 3. Calcule as três somas móveis e verifique se alguma é igual a 3.
Esta é a técnica por trás da solução do LeetCode 601 (Tráfego humano no estádio).
WITH flagged AS (
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales
),
w AS (
SELECT *,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);A armadilha das lacunas do calendário
A abordagem da soma da janela usa ROWS, que conta linhas do resultado adjacentes, não dias adjacentes do calendário. Se um dia que não atende à condição já tiver sido filtrado, duas linhas poderão ser adjacentes no resultado, mas não consecutivas no calendário.
Lição: aplique a janela deslizante à série diária completa (não faça um filtro prévio) ou use o método da âncora de datas, que respeita inerentemente as lacunas do calendário. Declare essa diferença na entrevista.
Generalizando para qualquer N
A abordagem 1 (filtrar e depois formar ilhas) generaliza de modo trivial: basta alterar HAVING COUNT(*) >= N. Essa é sua grande vantagem sobre a soma de várias janelas, que precisa de mais intervalos à medida que N cresce.
Para um N parametrizado ou grande, prefira o método das ilhas — ele exige uma única alteração de limite, em vez de N−1 janelas escritas manualmente.
-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5Escolhendo uma abordagem
Um guia rápido para dizer em voz alta:
- Filtrar e depois formar ilhas: respeita as lacunas do calendário, generaliza para qualquer N e retorna sequências completas — a opção padrão segura.
- Soma em janela deslizante: é elegante para um N pequeno e fixo em uma série diária densa, mas é preciso observar a armadilha entre ROWS e o calendário.
Mencionar ambas e depois justificar sua escolha é exatamente o que entrevistadores de nível intermediário a sênior valorizam.
Solução completa
A resposta portátil, válida para qualquer N, que respeita a consecutividade do calendário e retorna as datas que atendem à condição:
WITH qualifying AS (
SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
),
islands AS (
SELECT sale_date - rn AS grp, COUNT(*) AS len
FROM numbered
GROUP BY sale_date - rn
HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;Verificação rápida
Identifique o erro sutil.
Recapitulação
Para N linhas consecutivas que atendem a uma condição:
- Filtrar e depois formar ilhas: mantenha as linhas que atendem à condição, crie a âncora com
date - ROW_NUMBER(), agrupe e useHAVING COUNT(*) >= N. Generaliza e respeita as lacunas do calendário. - Soma em janela deslizante: sinalize as linhas e some em intervalos fixos de N linhas; é elegante, mas tenha cuidado com a diferença entre ROWS e o calendário em dados filtrados previamente.
A seguir: calcular a sequência ativa atual de um usuário até hoje.
Perguntas Frequentes
A aula “N linhas consecutivas que atendem a uma condição” é grátis?
Sim — o texto completo de “N linhas consecutivas que atendem a uma condição” é 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 “N linhas consecutivas que atendem a uma condição”?
O padrão clássico de janela com “três dias consecutivos com vendas acima de X”. 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 3 de 4.
Quanto tempo leva a aula “N linhas consecutivas que atendem a uma condição”?
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
- Detectando dias consecutivos no calendário
- Maior sequência por usuário
- N linhas consecutivas que atendem a uma condição
- Sequência ativa atual até hoje