1
resposta

Resolução Exercício - Identificando clientes com idade abaixo da média

WITH MediaIdadeClientes AS (
    SELECT
        AVG(FLOOR(DATEDIFF(CURRENT_DATE(), c.DataNascimento) / 365)) AS media_idade
    FROM tabelaclientes AS c
),
ClientesAbaixoMediaIdade AS (
    SELECT
        c.Nome AS nome
    ,	FLOOR(DATEDIFF(CURRENT_DATE(), c.DataNascimento) / 365) AS idade
    FROM tabelaclientes AS c
)

SELECT
    nome
,	idade
FROM ClientesAbaixoMediaIdade
INNER JOIN MediaIdadeClientes ON 1=1
WHERE 1=1
AND idade < media_idade
;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Carlos. Como vai?

Excelente resolução! Você fechou esse bloco de exercícios com uma das estruturas mais sofisticadas quando falamos de Common Table Expressions (CTEs): o encadeamento de múltiplas tabelas temporárias (MediaIdadeClientes e ClientesAbaixoMediaIdade) separadas por vírgula dentro de um único bloco WITH.

O resultado no seu Result Grid (Roberto Lima com 30 anos e Fernanda Rocha com 25 anos) comprova que o script funcionou perfeitamente e cumpriu a regra de negócio proposta de forma dinâmica.

Vamos analisar alguns dos grandes destaques lógicos da sua solução e uma sacada técnica muito inteligente que você utilizou:

1. Cálculo Preciso de Idade Dinâmica

A combinação de funções de data que você usou para calcular a idade dos clientes está impecável:

FLOOR(DATEDIFF(CURRENT_DATE(), c.DataNascimento) / 365)
  • O DATEDIFF calcula a diferença bruta em dias entre a data atual e o nascimento.
  • Ao dividir por 365 e envelopar com a função FLOOR() (que arredonda o número sempre para baixo), você garante que o banco de dados retorne a idade exata da pessoa. Isso evita problemas de arredondamento precoce que aconteceriam com funções como ROUND().

2. A Estratégia do INNER JOIN ON 1=1 (Cross Join)

A forma como você cruzou a tabela de listagem de clientes com a tabela da média foi muito perspicaz.

Como a CTE MediaIdadeClientes realiza uma agregação (AVG) sem nenhuma cláusula de agrupamento, ela devolve uma tabela de uma única linha e uma única coluna.

Para conseguir comparar a idade de cada cliente individual com esse valor global, você utilizou um INNER JOIN ON 1=1. Na engenharia de dados, essa condição sempre verdadeira (1=1) atua como um Cross Join, acoplando essa única linha da média em todas as linhas da listagem de clientes. Isso permitiu que você fizesse o filtro condicional WHERE idade < media_idade logo em seguida de maneira direta.

3. Uma Dica de Simplificação de Código

A sua lógica está correta e performática. Apenas como uma dica de estilo e legibilidade (o famoso "açúcar sintático"), o SQL possui uma cláusula nativa chamada CROSS JOIN que serve exatamente para esse cenário de cruzar tabelas sem chaves correspondentes, dispensando a necessidade de usar o truque do ON 1=1 e o WHERE 1=1.

Veja como a sua consulta final externa ficaria um pouco mais limpa e direta para a leitura de outros desenvolvedores:

SELECT
    cam.nome,
    cam.idade
FROM ClientesAbaixoMediaIdade AS cam
-- O Cross Join anexa a linha da média automaticamente em todos os registros
CROSS JOIN MediaIdadeClientes AS mic
WHERE cam.idade < mic.media_idade;

Essa mudança é puramente estética, pois o plano de execução que o banco de dados cria para o CROSS JOIN e para o INNER JOIN ON 1=1 costuma ser exatamente o mesmo.

Parabéns, Carlos! Sua sequência de respostas no fórum demonstra um nível de senioridade e domínio técnico altíssimo na manipulação de dados estruturados com SQL.

Espero que possa ter lhe ajudado!