Erweiterte Sortierschlüsselspalten
Der Grund, warum das, was Sie tun möchten, nicht funktioniert, liegt in der logischen Reihenfolge der Operationen in SQL , die für Ihre erste Abfrage (vereinfacht) lautet:
FROM MonitoringJob
SELECT Category, CreationDatedh eine sogenannte erweiterte Sortierschlüsselspalte hinzufügen
ORDER BY CreationDate DESC
SELECT Categorydh entfernen Sie die erweiterte Sortierschlüsselspalte erneut aus dem Ergebnis.
Dank der erweiterten SQL-Standard- Sortierschlüsselspaltenfunktion ist es also durchaus möglich, nach etwas zu ordnen, das nicht in der SELECTKlausel enthalten ist, da es vorübergehend hinter den Kulissen hinzugefügt wird.
Warum funktioniert das nicht DISTINCT?
Wenn wir die DISTINCTOperation hinzufügen , wird sie zwischen SELECTund hinzugefügt ORDER BY:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Mit der erweiterten Sortierschlüsselspalte CreationDate wurde nun die Semantik der DISTINCTOperation geändert, sodass das Ergebnis nicht mehr dasselbe ist. Dies ist nicht das, was wir wollen, daher verbieten sowohl der SQL-Standard als auch alle vernünftigen Datenbanken diese Verwendung.
Problemumgehungen
Es kann wie folgt mit Standard-Syntax emuliert werden
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
Oder einfach (in diesem Fall), wie auch von Prutswonder gezeigt
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
Ich habe hier ausführlicher über SQL DISTINCT und ORDER BY gebloggt .