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 diperpanjang
ORDER 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 antara SELECT
dan ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Tapi sekarang, dengan kolom kunci sortir diperpanjang CreationDate
, semantik DISTINCT
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
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
Atau, sederhananya (dalam kasus ini), seperti yang ditunjukkan juga oleh Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
Saya telah membuat blog tentang SQL DISTINCT dan ORDER BY lebih detail di sini .