Rozszerzone kolumny kluczy sortowania
Przyczyną, dla której to, co chcesz zrobić, nie działa, jest logiczna kolejność operacji w SQL , która dla twojego pierwszego zapytania jest (uproszczona):
FROM MonitoringJob
SELECT Category, CreationDatetj. dodaj tzw. rozszerzoną kolumnę klucza sortowania
ORDER BY CreationDate DESC
SELECT Categorytzn. ponownie usuń rozszerzoną kolumnę klucza sortowania z wyniku.
Tak więc, dzięki funkcji rozszerzonej kolumny klucza sortowania w standardzie SQL , jest całkowicie możliwe uporządkowanie według czegoś, czego nie ma w SELECTklauzuli, ponieważ jest do niego tymczasowo dodawane za kulisami.
Więc dlaczego to nie działa DISTINCT?
Jeśli dodamy DISTINCToperację, zostanie ona dodana między SELECTa ORDER BY:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Ale teraz, dzięki rozszerzonej kolumnie klucza sortowania CreationDate , semantyka DISTINCToperacji została zmieniona, więc wynik nie będzie już taki sam. Nie tego chcemy, więc zarówno standard SQL, jak i wszystkie rozsądne bazy danych zabraniają tego użycia.
Obejścia
Można go emulować za pomocą standardowej składni w następujący sposób
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
Lub po prostu (w tym przypadku), jak pokazuje również Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
Więcej szczegółów na temat SQL DISTINCT i ORDER BY zamieściłem tutaj .