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, CreationDate
tj. dodaj tzw. rozszerzoną kolumnę klucza sortowania
ORDER BY CreationDate DESC
SELECT Category
tzn. 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 SELECT
klauzuli, ponieważ jest do niego tymczasowo dodawane za kulisami.
Więc dlaczego to nie działa DISTINCT
?
Jeśli dodamy DISTINCT
operację, zostanie ona dodana między SELECT
a ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Ale teraz, dzięki rozszerzonej kolumnie klucza sortowania CreationDate
, semantyka DISTINCT
operacji 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 .