Setelah menjalankan pernyataan berikut:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Saya mendapatkan nilai berikut dari database:
test3
test3
bildung
test4
test3
test2
test1
tapi saya ingin duplikatnya dihapus, seperti ini:
bildung
test4
test3
test2
test1
Saya mencoba menggunakan DISTINCT tetapi tidak berhasil dengan ORDER BY dalam satu pernyataan. Tolong bantu.
Penting:
Saya mencobanya dengan:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
itu tidak berhasil.
Urutan berdasarkan CreationDate sangat penting.
Jawaban:
Masalahnya adalah bahwa kolom yang digunakan di
ORDER BY
tidak ditentukan diDISTINCT
. Untuk melakukan ini, Anda perlu menggunakan fungsi agregat untuk mengurutkan, dan menggunakan aGROUP BY
untuk membuatnyaDISTINCT
berfungsi.Coba sesuatu seperti ini:
sumber
Kolom kunci sortir diperpanjang
Alasan mengapa apa yang ingin Anda lakukan tidak berfungsi adalah karena urutan logis operasi di SQL , yang, untuk kueri pertama Anda, adalah (disederhanakan):
FROM MonitoringJob
SELECT Category, CreationDate
yaitu menambahkan kolom kunci sortir diperpanjangORDER BY CreationDate DESC
SELECT Category
yaitu menghapus kolom kunci sortir diperpanjang lagi dari hasil.Jadi, berkat fitur kolom kunci pengurutan standar SQL standar , sangat mungkin untuk memesan berdasarkan sesuatu yang tidak ada dalam
SELECT
klausa, karena itu untuk sementara ditambahkan di belakang layar.Jadi, mengapa ini tidak berhasil
DISTINCT
?Jika kita menambahkan
DISTINCT
operasi, itu akan ditambahkan antaraSELECT
danORDER BY
:FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Tapi sekarang, dengan kolom kunci sortir diperpanjang
CreationDate
, semantikDISTINCT
operasi telah diubah, sehingga hasilnya tidak akan sama lagi. Ini bukan yang kami inginkan, jadi standar SQL, dan semua database yang masuk akal melarang penggunaan ini.Solusi
Ini dapat diemulasikan dengan sintaks standar sebagai berikut
Atau, sederhananya (dalam kasus ini), seperti yang ditunjukkan juga oleh Prutswonder
Saya telah membuat blog tentang SQL DISTINCT dan ORDER BY lebih detail di sini .
sumber
DISTINCT ON
kerjanya dan cukup yakin itu tidak membantu di sini. Ekspresi dalam tanda kurung inilah yang digunakan untuk menentukan perbedaan (kondisi pengelompokan). Jika ada kategori berbeda dengan yang samaCreationDate
maka hanya satu dari mereka yang akan muncul di hasil! Karena saya bertanya-tanya apakah mungkin saya salah, saya juga memuat contoh database di posting blog Anda untuk memeriksa ulang:DISTINCT ON
kueri yang Anda berikan di sana menghasilkan total 1000 hasil (dengan banyak duplikatlength
) sedangkan kueri di bawahnya memberikan hanya 140 nilai (unik).DISTINCT
(tidakON
) dan satu lagi yang menggunakanDISTINCT ON
. Harap perhatikan bahwa yang terakhir secara eksplisit tidak menghapus panjang duplikat, tetapi judul duplikat. Saya pikir jawaban saya di sini sepenuhnya benar.DISTINCT ON
kondisi Anda menghapus duplikat menggunakan kondisi yang salah. Dalam posting blog Anda,DISTINCT ON
kueri benar-benar menghapus judul duplikat , namunDISTINCT
kueri di atasnya dan kueri di bawahnya (yang Anda klaim sebagai "gula sintaks" untuk) sama-sama menghapus panjang duplikat , karena mungkin itulah keseluruhan tujuan. Hal yang sama berlaku di sini: OP menginginkan Kategori duplikat dihapus, bukan duplikat Tanggal Pembuatan seperti yang dilakukanDISTINCT ON
kueri. Jika Anda masih tidak mempercayai saya, uji sendiri.Jika keluaran MAX (CreationDate) tidak diinginkan - seperti pada contoh pertanyaan awal - satu-satunya jawaban adalah pernyataan kedua dari jawaban Prashant Gupta:
Penjelasan: Anda tidak dapat menggunakan klausa ORDER BY dalam fungsi sebaris, sehingga pernyataan dalam jawaban Prutswonder tidak dapat digunakan dalam kasus ini, Anda tidak dapat meletakkan pilihan luar di sekitarnya dan membuang bagian MAX (Tanggal Pembuatan).
sumber
Cukup gunakan kode ini, Jika Anda menginginkan nilai kolom [Category] dan [CreationDate]
Atau gunakan kode ini, Jika Anda hanya menginginkan nilai kolom [Kategori].
Anda akan memiliki semua rekaman berbeda apa pun yang Anda inginkan.
sumber
Event
Anda yang disebut, Anda dapat menulis[Event]
alih-alihEvent
menghentikan SQL yang membuat kesalahan parse.Hasil asli menunjukkan bahwa "test3" memiliki banyak hasil ...
Sangat mudah untuk mulai menggunakan MAX setiap saat untuk menghapus duplikat di Group By's ... dan melupakan atau mengabaikan pertanyaan yang mendasarinya ...
OP mungkin menyadari bahwa menggunakan MAX memberinya "ciptaan" terakhir dan menggunakan MIN akan memberikan "ciptaan" pertama ...
sumber
MAX
, daripada sesuatu yang berdiri sendiri sebagai jawaban atas pertanyaan.sumber
Dengan subquery, itu harus bekerja:
sumber
Distinct akan mengurutkan record dalam urutan menaik. Jika Anda ingin mengurutkan secara desc gunakan:
Jika Anda ingin mengurutkan record berdasarkan field CreationDate maka field ini harus ada dalam pernyataan pilih:
sumber
Anda dapat menggunakan CTE:
sumber
Coba selanjutnya, tetapi tidak berguna untuk data besar ...
sumber
ORDER BY
di sub-kueri benar-benar valid. Dan seseorang bahkan memilih komentar salah Anda.Itu bisa dilakukan dengan menggunakan permintaan batin Seperti ini
sumber
sumber