0Pricing
SQL Interview Prep · Aula

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 dia
  • amount — 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 |  200

Abordagem 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(*) >= 5

Escolhendo 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 use HAVING 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

  1. Detectando dias consecutivos no calendário
  2. Maior sequência por usuário
  3. N linhas consecutivas que atendem a uma condição
  4. Sequência ativa atual até hoje
← Voltar para SQL Interview Prep