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 Coding 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 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.
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,...,99Gerando 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 JOINcom os fatos, usandoCOALESCEpara preencher as lacunas. - Prefira
generate_seriesquando estiver disponível e fique atento aMAXRECURSIONno 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 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 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 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
- Membros âncora e recursivos
- Percorrendo um organograma
- Gerando séries de números e datas
- Evitando recursão infinita