[RESOLVIDO] Como fazer essa query ? (SQL Server - dialeto T-SQL)

4 respostas
jMarcel

Pessoal,

tenho uma tabela conforme abaixo e quero fazer uma query p/ extrair clientes distintos que tem a maior data.
Por ex.: o cliente ‘BBBB’ tem a maior data = ‘03/08/2011’, logo o resultado p/ ele seria a linha 5 da tb1.

tb1:

cod	Nome	item	Data
1	AAAA	3	02/04/2012
1	AAAA	9	03/08/2011
2	BBBB	2	09/06/2011
2	BBBB	8	03/08/2011
2	BBBB	4	01/02/2011
3	CCCC	7	28/03/2011
3	CCCC	3	22/11/2011
4	DDDD	1	26/08/2011
4	DDDD	6	06/09/2011

Resultado pretendido:

cod	Nome	item	Data
1	AAAA	3	02/04/2012
2	BBBB	8	03/08/2011
3	CCCC	3	22/11/2011
4	DDDD	6	06/09/2011

Alguém sabe montar essa query ?

4 Respostas

A

Faça um select agrupando pelo nome, com a maior data (max).

Depois faça um select novamente nesta tabela, fazendo um join com o resultado da primeira parte aí em cima.
(O join por nome e data)

Pode haver um pequeno problema nessa abordagem porém: as datas podem se repetir?

Se puderem, você terá que criar um critério desempate…como o campo cod por exemplo (imagino que seja sua pk).

Neste caso você acha a maior data (com a primeira parte), usa a mesma técnica para achar o maior código das maiores datas e por fim, faz um join por código com a tabela principal.

jMarcel

AbelBueno:
Faça um select agrupando pelo nome, com a maior data (max).

Depois faça um select novamente nesta tabela, fazendo um join com o resultado da primeira parte aí em cima.
(O join por nome e data)

Pode haver um pequeno problema nessa abordagem porém: as datas podem se repetir?

Se puderem, você terá que criar um critério desempate…como o campo cod por exemplo (imagino que seja sua pk).

Neste caso você acha a maior data (com a primeira parte), usa a mesma técnica para achar o maior código das maiores datas e por fim, faz um join por código com a tabela principal.

Entendi. Assim ficou mais fácil, pois as datas são únicas para cada cliente.

A quem interessar possa (tb1 = tbClientes x tbProdutos) :

with cte as (
select distinct x.cod, x.Nome, max(y.Data) as Data
from tbClientes x
left join tbProdutos y on x.cod=y.cod
group by x.cod, x.Nome
)
select distinct cte.cod, cte.Nome, cte.Data, y.Item
from cte 
inner join tbProdutos y on cte.cod=y.cod and cte.Data=y.Data

Valeu pela força !

novato25

Uma consulta SQL poderia ficar assim:

SELECT t1.* FROM tb1 t1 JOIN (SELECT MAX(t.data) AS data, t.cod FROM tb1 t GROUP BY t.cod) tb2 on t1.cod = tb2.cod and t1.data = tb2.data ORDER BY t1.cod

já a consulta T-SQL, bom, aí teria que se pensar mais um pouco. :slight_smile:

jMarcel

novato25:
Uma consulta SQL poderia ficar assim:

SELECT t1.* FROM tb1 t1 JOIN (SELECT MAX(t.data) AS data, t.cod FROM tb1 t GROUP BY t.cod) tb2 on t1.cod = tb2.cod and t1.data = tb2.data ORDER BY t1.cod

já a consulta T-SQL, bom, aí teria que se pensar mais um pouco. :slight_smile:

O post já foi Resolvido, mas obrigado pela sua participação !!

Criado 3 de abril de 2012
Ultima resposta 4 de abr. de 2012
Respostas 4
Participantes 3