Misalkan saya memiliki tabel alamat pelanggan:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
Di tabel, satu pelanggan seperti John Smith dapat memiliki beberapa alamat. Saya memerlukan kueri pemilihan untuk tabel ini untuk mengembalikan hanya baris pertama yang ditemukan di mana ada duplikat di 'CName'. Untuk tabel ini, ia harus mengembalikan semua baris kecuali yang ke-3 (atau ke-1 - salah satu dari dua alamat itu baik-baik saja tetapi hanya satu yang dapat dikembalikan). Apakah ada kata kunci yang dapat saya tambahkan ke kueri PILIH untuk memfilter berdasarkan apakah server telah melihat nilai kolom sebelumnya?
Di SQL 2k5 +, Anda dapat melakukan sesuatu seperti:
sumber
Anda bisa menggunakan
row_number()
untuk mendapatkan nomor baris dari baris tersebut. Ini menggunakanover
perintah -partition by
klausa menentukan kapan harus memulai kembali penomoran danorder by
memilih apa yang harus dipesan nomor baris. Bahkan jika Anda menambahkanorder by
di akhir kueri, itu akan mempertahankan urutan dalamover
perintah saat penomoran.sumber
ROW_NUMBER()
tidak berfungsi dalamWhere
klausul di Teradata jugaAnda dapat menggunakan
row_numer() over(partition by ...)
sintaks seperti ini:Apa yang dilakukannya adalah membuat kolom bernama
row
, yang merupakan penghitung yang bertambah setiap kali melihat hal yang samaCName
, dan mengindeks kejadian tersebutAddressLine
. Dengan memaksakanwhere row = 1
, seseorang dapat memilihCName
siapa yangAddressLine
datang lebih dulu menurut abjad. Jikaorder by
adalahdesc
, maka itu akan memilihCName
siapa yangAddressLine
datang terakhir menurut abjad.sumber
Ini akan memberi Anda satu baris dari setiap baris duplikat. Ini juga akan memberi Anda kolom tipe bit, dan bekerja setidaknya di MS Sql Server.
Jika Anda ingin mencari semua duplikat, cukup ubah rn = 1 menjadi rn> 1. Semoga ini bisa membantu
sumber