Digamos que eu tenha uma tabela de endereços de clientes:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
Na tabela, um cliente como John Smith pode ter vários endereços. Preciso que a consulta selecionada para esta tabela retorne apenas a primeira linha encontrada onde há duplicatas em 'CName'. Para esta tabela, ele deve retornar todas as linhas, exceto a 3ª (ou 1ª - qualquer um desses dois endereços está correto, mas apenas um pode ser retornado). Existe uma palavra-chave que posso adicionar à consulta SELECT para filtrar com base no fato de o servidor já ter visto o valor da coluna antes?
No SQL 2k5 +, você pode fazer algo como:
fonte
Você pode usar
row_number()
para obter o número da linha da linha. Ele usa oover
comando - apartition by
cláusula especifica quando reiniciar a numeração eorder by
seleciona em que ordem o número da linha. Mesmo se você adicionar umorder by
ao final de sua consulta, isso preservará a ordem doover
comando durante a numeração.fonte
ROW_NUMBER()
também não funciona naWhere
cláusula do TeradataVocê pode usar a
row_numer() over(partition by ...)
sintaxe da seguinte forma:O que isso faz é criar uma coluna chamada
row
, que é um contador que aumenta sempre que vê o mesmoCName
, e indexa essas ocorrências porAddressLine
. Ao imporwhere row = 1
, pode-se selecionar oCName
queAddressLine
vem primeiro em ordem alfabética. Se oorder by
foidesc
, em seguida, ele iria pegar oCName
cujaAddressLine
vem por último em ordem alfabética.fonte
Isso lhe dará uma linha de cada linha duplicada. Ele também fornecerá as colunas do tipo bit e funciona pelo menos no MS Sql Server.
Se você quiser encontrar todas as duplicatas, basta alterar o rn = 1 para rn> 1. Espero que isso ajude
fonte