0Pricing
SQL Interview Prep · Aula

Gerando séries de números e datas

Use recursão para produzir sequências para preencher lacunas e criar calendários.

Gerando séries de números e datas é 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.

Recursão sem hierarquia

CTEs recursivas não servem apenas para árvores. Uma segunda aplicação importante é gerar sequências: uma sequência de números ou todas as datas de um intervalo. Entrevistadores perguntam sobre isso quando um problema exige preenchimento de lacunas — produzir linhas que não existem em nenhuma tabela.

O enunciado clássico é: "Mostre as vendas por dia do mês, incluindo os dias sem vendas." Não é possível mostrar um dia ausente sem primeiro gerar todos os dias.

Uma série simples de números

A âncora inicia o primeiro número; o membro recursivo adiciona um a cada iteração; um WHERE no membro recursivo o interrompe. Isso gera os números de 1 a 10.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;

O predicado de terminação

Ao contrário do organograma, uma série de números não tem uma folha natural na qual parar — seria possível incrementá-la indefinidamente. Portanto, é necessário adicionar uma condição de parada explícita no membro recursivo: WHERE n < 10.

Quando n chega a 10, o WHERE da próxima iteração filtra a única linha candidata, o membro recursivo não retorna nada e a recursão para. Esquecer essa proteção é a principal causa de recursão descontrolada em entrevistas.

Parametrizando o intervalo

Deixe a série flexível definindo o limite a partir de um valor ou de uma variável. Aqui, geramos de 1 a N, sendo N fornecido externamente. A mesma estrutura produz séries baseadas em zero ou com incrementos definidos — basta alterar a âncora e o incremento.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums;  -- odd numbers 1,3,5,...,99

Gerando uma série de datas

Substitua as operações com inteiros por operações com datas e você terá um calendário. A âncora é a data inicial; o membro recursivo adiciona um dia até ultrapassar a data final.

A sintaxe para adicionar um dia varia conforme o dialeto — esta forma, no estilo do Postgres, usa um intervalo.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day'
    FROM cal
    WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;

Preenchimento de lacunas com um LEFT JOIN

Agora combine o calendário com dados reais. Gere todos os dias e depois faça um LEFT JOIN com a tabela de vendas, para que os dias ausentes apareçam com um NULL, que você transforma em 0 usando COALESCE.

Esse padrão em duas etapas — gerar a estrutura-base e depois fazer uma junção à esquerda com os fatos — é o cerne de toda resposta sobre preenchimento de lacunas.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day' FROM cal
    WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;

Estruturas-base mensais e semanais

Altere o incremento para criar calendários mais abrangentes. Adicione INTERVAL '1 month' para uma estrutura-base mensal ou INTERVAL '7 day' para semanas. Isso é útil quando o entrevistador quer um relatório por mês que inclua meses vazios.

WITH RECURSIVE months AS (
    SELECT DATE '2024-01-01' AS m
    UNION ALL
    SELECT m + INTERVAL '1 month' FROM months
    WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;

Diferenças entre dialetos nas operações com datas

A aritmética de datas é a parte menos portável dessas consultas. Conheça as variações:

  • Postgres: d + INTERVAL '1 day'.
  • MySQL: DATE_ADD(d, INTERVAL 1 DAY).
  • SQL Server: DATEADD(DAY, 1, d).
  • SQLite: date(d, '+1 day').

Mencionar que a estrutura da recursão é idêntica e que apenas a função de data muda demonstra domínio do dialeto e é uma resposta forte.

Recursão versus generate_series

O Postgres inclui a função integrada generate_series(), que produz números ou datas sem recursão, de forma mais rápida e clara:

SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');

Se o banco de dados usado pelo entrevistador oferecer esse recurso, prefira-o. Porém, muitos mecanismos — como o MySQL e versões antigas do SQL Server — não o possuem; é exatamente nesse caso que a CTE recursiva funciona como alternativa de reserva portável.

Observe o limite da recursão

Gerar uma série grande pode atingir o limite de recursão do mecanismo. O SQL Server usa MAXRECURSION 100 por padrão, portanto um calendário de 365 dias falha, a menos que você acrescente OPTION (MAXRECURSION 0) para remover o limite.

O Postgres não tem um limite fixo, mas uma série descontrolada com um predicado incorreto pode continuar até esgotar a memória. Sempre confirme se o predicado de terminação está correto antes de aumentar a escala.

-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);

Fazendo uma junção cruzada com a série

Uma série gerada costuma ser apenas um componente. Depois de criar uma CTE de números, faça um CROSS JOIN com ela para expandir ou desdobrar linhas — por exemplo, para repetir cada linha de pedido de acordo com sua quantidade ou para distribuir um intervalo de datas por cliente.

Reconhecer que a recursão produz um bloco de construção reutilizável, e não apenas uma resposta final, é o que diferencia uma resposta bem elaborada em uma entrevista de uma resposta decorada.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;

Verificação rápida

Por que o predicado de parada é essencial em uma série de números ou datas?

Recapitulação

A recursão pode fabricar linhas que não existem em nenhuma tabela:

  • Inicie o primeiro valor na âncora e incremente-o no membro recursivo.
  • Sempre adicione um predicado de terminação explícito — as séries não têm um fim natural.
  • Construa uma estrutura-base de datas ou números e depois faça um LEFT JOIN com os fatos, usando COALESCE para preencher as lacunas.
  • Prefira generate_series quando estiver disponível e fique atento a MAXRECURSION no SQL Server.

Próximo: as técnicas de segurança que impedem a recursão de sair do controle.

Perguntas Frequentes

A aula “Gerando séries de números e datas” é grátis?

Sim — o texto completo de “Gerando séries de números e datas” é 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 “Gerando séries de números e datas”?

Use recursão para produzir sequências para preencher lacunas e criar calendários. 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 “Gerando séries de números e datas”?

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. Membros âncora e recursivos
  2. Percorrendo um organograma
  3. Gerando séries de números e datas
  4. Evitando recursão infinita
← Voltar para SQL Interview Prep