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, CreationDateyaitu menambahkan kolom kunci sortir diperpanjang
ORDER BY CreationDate DESC
SELECT Categoryyaitu 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 SELECTklausa, karena itu untuk sementara ditambahkan di belakang layar.
Jadi, mengapa ini tidak berhasil DISTINCT?
Jika kita menambahkan DISTINCToperasi, itu akan ditambahkan antara SELECTdan ORDER BY:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Tapi sekarang, dengan kolom kunci sortir diperpanjang CreationDate , semantik DISTINCToperasi 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 .