Powiedzmy, że mam tabelę adresów klientów:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
W tabeli jeden klient, taki jak John Smith, może mieć wiele adresów. Potrzebuję zapytania wybierającego dla tej tabeli, aby zwracał tylko pierwszy znaleziony wiersz, w którym znajdują się duplikaty w „CName”. W przypadku tej tabeli powinna zwrócić wszystkie wiersze z wyjątkiem trzeciego (lub pierwszego - każdy z tych dwóch adresów jest prawidłowy, ale można zwrócić tylko jeden). Czy istnieje słowo kluczowe, które mogę dodać do zapytania SELECT, aby filtrować na podstawie tego, czy serwer widział już wcześniej wartość kolumny?
W SQL 2k5 + możesz zrobić coś takiego:
;with cte as ( select CName, AddressLine, rank() over (partition by CName order by AddressLine) as [r] from MyTable ) select CName, AddressLine from cte where [r] = 1
źródło
Możesz użyć,
row_number()
aby uzyskać numer wiersza wiersza. Używaover
polecenia -partition by
klauzula określa, kiedy ponownie uruchomić numerowanie, aorder by
wybiera, na czym ma być uporządkowany numer wiersza. Nawet jeśli dodaszorder by
na końcu zapytania, zachowałoby to kolejność wover
poleceniu podczas numerowania.select * from mytable where row_number() over(partition by Name order by AddressLine) = 1
źródło
ROW_NUMBER()
nie działa również wWhere
klauzuli w TeradataMożesz użyć takiej
row_numer() over(partition by ...)
składni:select * from ( select * , ROW_NUMBER() OVER(PARTITION BY CName ORDER BY AddressLine) AS row from myTable ) as a where row = 1
Powoduje to utworzenie kolumny o nazwie
row
, która jest licznikiem, który zwiększa się za każdym razem, gdy widzi to samoCName
, i indeksuje te wystąpienia wedługAddressLine
. Narzucającwhere row = 1
, można wybrać,CName
ktoAddressLine
jest pierwszy w kolejności alfabetycznej. Gdyby takorder by
byłodesc
, wybierałoby to,CName
któreAddressLine
jest ostatnie w kolejności alfabetycznej.źródło
To da ci jeden wiersz z każdego zduplikowanego wiersza. Podaje również kolumny typu bitowego i działa przynajmniej na serwerze MS Sql.
(select cname, address from ( select cname,address, rn=row_number() over (partition by cname order by cname) from customeraddresses ) x where rn = 1) order by cname
Jeśli zamiast tego chcesz znaleźć wszystkie duplikaty, po prostu zmień rn = 1 na rn> 1. Mam nadzieję, że to pomoże
źródło