GROUP BY POR NOME, MOSTRANDO REGISTRO COM A MAIOR DATA DE LANCAMENTO

SQL

Firebird

29/02/2024

Bom dia a todos

Pessoal, sou novo no fórum e estou com um problema. Estou tentando agrupar dois campos somente(NOMECLIENTE, DATAVENCIMENTO) mas da forma q estou fazendo ele ate agrupa, mas esta mostrando o mesmo cliente varias vezes em datas diferentes. Preciso q mostre somente uma vez com a maior data.

Delphi 7, Firebird

Nao tenho a função q estou utilizando por q nao estou em casa no momento. Mas salvo engano, estou utilizando da seguinte forma:

select NOMECLIENTE, DATAVENCIMENTO MAX(DATAVENCIMENTO
from CLIENTE
GroupBy NOMECLIENTE, DATAVENCIMENTO

Exemplo de como esta os registros na tabela
CLIENTE-DATAVENCIMENTO
A - 01/01/2024
A - 01/02/2024
A - 01/03/2024
B - 01/01/2024
B - 01/02/2024
B - 01/03/2024

Preciso que me retorne assim:
CLIENTE - DATAVENCIMENTO
A - 01/03/2024
B - 01/03/2024
Heder

Heder

Curtidas 0

Melhor post

Weber

Weber

29/02/2024

select NOMECLIENTE, MAX(DATAVENCIMENTO) as DATAVENCIMENTO from CLIENTE
GroupBy NOMECLIENTE
GOSTEI 1

Mais Respostas

Heder

Heder

29/02/2024

select NOMECLIENTE, MAX(DATAVENCIMENTO) as DATAVENCIMENTO from CLIENTE
GroupBy NOMECLIENTE


==
Boa noite, Muito obrigado! Certinho!
GOSTEI 0
Heder

Heder

29/02/2024

Outra duvida relacinada ao mesmo assunto.

Tem como aplicar o filtro depois do agrupamento? Por q precisei filtar so que dai fica errado o resultado.

Precisaria agrupar tudo, conforme o código acima q ficou certinho e dai filtrar o que foi agrupado pela data menor q a do sistema.

Minha instrução está assim:

With Q1 do
begin
Close;
SQL.Clear ;
SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO');
SQL.Add('FROM DONATE');
SQL.Add('WHERE DTASEGURO <= :Hoje');
SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA');
SQL.ADD('ORDER BY DTASEGURO DESC');
ParamByName('Hoje').AsDate := Date;
Open;
end;
end;

Dessa forma agrupa certinho, porém o filtro ta sendo aplicado antes do agrupamento e com isso ele fica retornando os clientes q ainda nao venceram o seguro. Por isso precisaria agrupar tudo, mostrar no agrupamento a ultima data e dai filtrar tudo para mostrar somente os que estao com data menor q a do sistema(atual)

Em resumo seria: APLICAR O FILTRO DEPOIS DO AGRUPAMENTO

Desde de já agradeço
GOSTEI 0
Guttizin

Guttizin

29/02/2024

Não é conflito com o nome da coluna que vc tá está sobreescrevendo MAX(DTASEGURO) as DTASEGURO?

O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.

SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');

ou

SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');
GOSTEI 1
Heder

Heder

29/02/2024

Não é conflito com o nome da coluna que vc tá está sobreescrevendo MAX(DTASEGURO) as DTASEGURO?

O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.

SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');

ou

SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');


==
Boa tarde, vou testar. Muito obrigado
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

29/02/2024

Um usuário pode ter vários seguros, a ideia é pegar todos que tem como último seguro (mais recente), com data menor que a data atual.

Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.

Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.

SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO');
SQL.Add('FROM DONATE');
SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA');
SQL.Add('HAVING MAX(DTASEGURO) <= :Hoje');
SQL.ADD('ORDER BY DTASEGURO DESC');
ParamByName('Hoje').AsDate := Date;

GOSTEI 0
Heder

Heder

29/02/2024

Um usuário pode ter vários seguros, a ideia é pegar todos que tem como último seguro (mais recente), com data menor que a data atual.

Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.

Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.

SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO');
SQL.Add('FROM DONATE');
SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA');
SQL.Add('HAVING MAX(DTASEGURO) <= :Hoje');
SQL.ADD('ORDER BY DTASEGURO DESC');
ParamByName('Hoje').AsDate := Date;



==
Boa noite! Bem isso que precisava. Muito obrigado a todos. Então só a titulo de compreenssão: WHERE utilizo antes do GROUP BY e o HAVIN após. Isso? WHERE filtra antes e o HAVING depois do GROUP BY?
GOSTEI 0
POSTAR