sexta-feira, 18 de fevereiro de 2011

Eliminando duplicatas de um SELECT com CTE

Já passei por esta situação diversas vezes, e nunca registrei como resolvi, portanto lá vai. Para resolver registros duplicados de um select pode parecer fácil usando distinct ou group by, porém existem situações onde isso não é possível. Vou usar o seguinte exemplo, com este script:

 

USE TEMPDB

GO

 

CREATE TABLE valores(

  nome VARCHAR(100)

  ,flativo BIT

  ,codigo int identity(1,1)

  ,valor INT

)

GO

 

INSERT INTO valores VALUES ('Rodrigo',1,1)

INSERT INTO valores VALUES ('Rodrigo',1,2)

INSERT INTO valores VALUES ('Daniel',1,1)

INSERT INTO valores VALUES ('Daniel',1,3)

INSERT INTO valores VALUES ('Maria',1,1)

INSERT INTO valores VALUES ('Maria',1,4)

GO

 

Se executarmos um simples select na tabela valores, obteremos o seguinte resultado:

 

nome

flativo

codigo

valor

Rodrigo

1

1

1

Rodrigo

1

2

2

Daniel

1

3

1

Daniel

1

4

3

Maria

1

5

1

Maria

1

6

4

 

 

Vamos supor que o nosso “cliente” pediu um relatório listando o todos os campos, porém somente os registros com maior número no campo valor. Se fizermos o seguinte select...

 

SELECT

      nome

      ,flativo

      ,codigo

      ,max(valor)

FROM

      VALORES V

group by nome

      ,flativo

      ,codigo

order by 1

 

Não conseguimos acertar o resultado

 

nome

flativo

codigo

(No column name)

Daniel

1

3

1

Daniel

1

4

3

Maria

1

5

1

Maria

1

6

4

Rodrigo

1

1

1

Rodrigo

1

2

2

 

Então como resolver? Uma ótima oportunidade para usar os CTEs. Observe a seguinte query:

 

WITH T1 AS

(SELECT

      NOME,

      MAX(VALOR) AS VALOR

 FROM

      valores

 GROUP BY

      NOME)

 

SELECT

      V.*

FROM

      VALORES V

JOIN T1 ON T1.VALOR=V.VALOR

ORDER BY 1

 

O resultado fica:

 

nome

flativo

codigo

valor

Daniel

1

4

3

Maria

1

6

4

Rodrigo

1

2

2

 

Abs e até a próxima!

 

Nenhum comentário:

Postar um comentário

Leave your comment here!