2
respostas

Dúvida calcular idade média

Para o exercício abaixo, fiz a solução utilizando o SQL Server:

/*
A equipe de análise deseja identificar clientes que estão abaixo da média de idade do público da instituição,
pois podem representar um nicho de mercado específico para produtos financeiros direcionados a jovens adultos.

Crie duas CTEs: uma para calcular a idade média dos clientes e outra para identificar os clientes com idade abaixo dessa média.
*/
WITH CalculaIdadeMedia AS (
SELECT C.ID_CLIENTE, C.Nome, CAST(DATEDIFF(DAY, C.DataNascimento, GETDATE()) / 365.25 AS INT) AS Idade
FROM TabelaClientes C
),
IdadeAbaixoDaMEdia AS (
SELECT AVG(C.Idade) AS IdadeMedia
FROM CalculaIdadeMedia C
)
SELECT A.Nome, A.Idade
FROM CalculaIdadeMedia A
CROSS JOIN IdadeAbaixoDaMEdia B
WHERE A.Idade < B.IdadeMedia

Alguém chegou em algo parecido, no meu caso retornou 2 registros.

2 respostas

Oi, Ricardo! Como vai?

Agradeço por compartilhar sua solução, você está se saindo muito bem! O problema pode está como calculou a idade com DATEDIFF(DAY, C.DataNascimento, GETDATE()) / 365.25, que pode não lidar corretamente com anos bissextos ou variações nos tamanhos dos meses, resultando em pequenas diferenças no cálculo da idade.

Por exemplo, na solução do instrutor usa strftime no SQLite para calcular a idade baseada apenas na diferença de anos, o que é mais simples e pode estar mais alinhado com os dados esperados.

WITH IdadesClientes AS (
    SELECT Nome, strftime('%Y', 'now') - strftime('%Y', DataNascimento) AS Idade
    FROM TabelaClientes
),
MediaIdade AS (
    SELECT AVG(Idade) AS IdadeMedia
    FROM IdadesClientes
)
SELECT ic.Nome, ic.Idade
FROM IdadesClientes ic
CROSS JOIN MediaIdade mi
WHERE ic.Idade < mi.IdadeMedia;

Para alcançar os 3 registros (Roberto Lima: 30, Fernanda Rocha: 25, Paula Mendes: 32), teste usar o DATEDIFF(YEAR, C.DataNascimento, GETDATE()) no SQL Server, para ser considerado o ano completo:

WITH CalculaIdadeMedia AS (
    SELECT C.ID_CLIENTE, C.Nome, DATEDIFF(YEAR, C.DataNascimento, GETDATE()) AS Idade
    FROM TabelaClientes C
),
IdadeAbaixoDaMedia AS (
    SELECT AVG(C.Idade) AS IdadeMedia
    FROM CalculaIdadeMedia C
)
SELECT A.Nome, A.Idade
FROM CalculaIdadeMedia A
CROSS JOIN IdadeAbaixoDaMedia B
WHERE A.Idade < B.IdadeMedia;

Espero ter ajudado e qualquer dúvida, compartilhe no fórum.

Até mais, Ricardo!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!

Bom dia.

Entendo o seu ponto de vista Nathália, porém, essa abordagem citada por você: DATEDIFF(YEAR, C.DataNascimento, GETDATE()), no SQL Server, sempre vai dar diferença em determinado mês de nascimento da pessoa, quer seja ano bissexto ou não.

Por isso sempre utilizo este formato para calcular a idade: CAST(DATEDIFF(DAY, C.DataNascimento, GETDATE()) / 365.25 AS INT), no SQL Server.