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!