0Pricing
SQL Academy · Aula

Gerando séries e sequências

Crie linhas com recursão.

Gerando séries e sequências é uma aula grátis de SQL Academy 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 Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

O que é uma série gerada?

Às vezes, você precisa de uma lista de números, datas ou outros valores sequenciais que não existem em nenhuma tabela. O SQL permite criar esses valores sob demanda usando recursão ou funções integradas.

Nesta lição, você aprenderá a gerar sequências usando WITH RECURSIVE — uma ferramenta poderosa que permite que uma consulta faça referência à própria saída.

Sua primeira CTE recursiva

Uma CTE recursiva (expressão de tabela comum) tem duas partes unidas por UNION ALL: um caso base que produz a primeira linha e uma etapa recursiva que faz referência à própria CTE para produzir a próxima linha.

A recursão para quando a etapa recursiva não retorna nenhuma linha.

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

Como a recursão se desenrola

É útil imaginar cada etapa separadamente. O caso base inicializa a tabela, e cada passagem recursiva adiciona mais uma linha até que a condição WHERE deixe de ser satisfeita.

Para a consulta WHERE n < 5, o mecanismo gera as linhas 1, 2, 3, 4, 5 e então para, porque 5 < 5 é falso.

WITH RECURSIVE steps(n, note) AS (
  SELECT 1, 'base case'
  UNION ALL
  SELECT n + 1, 'recursive step'
  FROM steps
  WHERE n < 4
)
SELECT n, note FROM steps;

Gerando números pares

Você pode alterar o tamanho do passo simplesmente adicionando um valor maior que 1 na parte recursiva. Isso produz todos os números pares de 2 a 10.

O padrão é sempre: próximo_valor = valor_atual + passo.

WITH RECURSIVE evens(n) AS (
  SELECT 2
  UNION ALL
  SELECT n + 2 FROM evens WHERE n < 10
)
SELECT n FROM evens;

Contando para baixo

A recursão não se limita a contar para cima. Subtraia em vez de adicionar para obter uma sequência decrescente. Certifique-se de que a condição de parada use > em vez de < para evitar um laço infinito.

WITH RECURSIVE countdown(n) AS (
  SELECT 10
  UNION ALL
  SELECT n - 1 FROM countdown WHERE n > 1
)
SELECT n FROM countdown;

Gerando um intervalo de datas

Um dos usos mais práticos das CTEs recursivas é criar uma série de datas. Você começa em uma data específica e continua adicionando um dia até chegar a uma data final.

Isso é especialmente útil para preencher lacunas em relatórios — cada data aparece mesmo que não haja dados para aquele dia.

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

Preenchendo lacunas em relatórios com uma série de datas

Imagine uma tabela sales que só tenha linhas nos dias em que ocorreram vendas. Ao fazer uma junção entre uma série de datas gerada e a tabela de vendas usando LEFT JOIN, você obtém todos os dias do intervalo, com NULL nos dias sem vendas.

WITH RECURSIVE cal(d) AS (
  SELECT DATE '2024-03-01'
  UNION ALL
  SELECT d + INTERVAL '1 day' FROM cal WHERE d < DATE '2024-03-05'
),
sales(sale_date, amount) AS (
  VALUES
    (DATE '2024-03-01', 100),
    (DATE '2024-03-03', 250),
    (DATE '2024-03-05', 180)
)
SELECT cal.d, COALESCE(sales.amount, 0) AS amount
FROM cal
LEFT JOIN sales ON cal.d = sales.sale_date
ORDER BY cal.d;

Gerando uma tabuada

As CTEs recursivas podem transportar várias colunas, permitindo criar resultados mais elaborados. Aqui, tanto um índice de linha quanto um valor calculado são acompanhados ao mesmo tempo.

WITH RECURSIVE mult(n, result) AS (
  SELECT 1, 1 * 7
  UNION ALL
  SELECT n + 1, (n + 1) * 7
  FROM mult
  WHERE n < 10
)
SELECT n, result AS seven_times_n FROM mult;

Números de Fibonacci

Fibonacci é uma sequência clássica em que cada número é a soma dos dois anteriores: 0, 1, 1, 2, 3, 5, 8 …

Uma CTE recursiva acompanha o valor atual a e o próximo valor b, trocando-os a cada etapa.

WITH RECURSIVE fib(a, b) AS (
  SELECT 0, 1
  UNION ALL
  SELECT b, a + b FROM fib WHERE a < 100
)
SELECT a AS fibonacci FROM fib;

Usando generate_series no PostgreSQL

O PostgreSQL oferece um atalho integrado chamado generate_series() que produz sequências sem exigir que você escreva uma CTE recursiva. Ele aceita um início, um fim e um passo opcional.

Essa é a maneira mais concisa de gerar intervalos de números ou datas no PostgreSQL.

SELECT gs AS num
FROM generate_series(1, 10, 2) AS gs;

Gerando intervalos mensais

Passe um intervalo de '1 month' para generate_series() a fim de criar um calendário mensal. Isso é perfeito para criar cabeçalhos de relatórios mensais ou verificar quais meses não têm dados.

SELECT gs::DATE AS month_start
FROM generate_series(
  '2024-01-01'::DATE,
  '2024-06-01'::DATE,
  INTERVAL '1 month'
) AS gs;

Verificação de conhecimentos

Teste sua compreensão sobre a geração de séries com CTEs recursivas.

Recapitulação: gerando séries e sequências

Nesta lição, você aprendeu a produzir sequências de números e datas sem nenhuma tabela de origem:

  • WITH RECURSIVE — um caso base mais uma etapa recursiva unidos com UNION ALL; para quando a etapa recursiva não retorna nenhuma linha.
  • Tamanho flexível do passo — adicione ou subtraia qualquer valor para contar para cima, contar para baixo ou pular valores.
  • Intervalos de datas — adicione um intervalo para gerar séries diárias, mensais ou de calendários personalizados.
  • CTEs com várias colunas — transporte informações adicionais entre as iterações para obter resultados mais elaborados, como Fibonacci.
  • generate_series() — função integrada do PostgreSQL para criar sequências de números e datas da maneira mais concisa.

As séries geradas são essenciais para preencher lacunas em relatórios, criar dados de teste e lidar com qualquer situação em que você precise de um intervalo completo de valores, independentemente do conteúdo dos dados.

Perguntas Frequentes

A aula “Gerando séries e sequências” é grátis?

Sim — o texto completo de “Gerando séries e sequências” é 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 Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “Gerando séries e sequências”?

Crie linhas com recursão. Você pratica SQL Academy 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 Academy?

Nenhuma experiência prévia é necessária. SQL Academy 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 e sequências”?

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 Academy?

Sim. Cada aula de SQL Academy 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. Como funcionam as CTEs recursivas
  2. Percorrendo uma árvore de categorias
  3. Gerando séries e sequências
  4. Evitando laços infinitos
← Voltar para SQL Academy