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, CreationDate
dh eine sogenannte erweiterte Sortierschlüsselspalte hinzufügen
ORDER BY CreationDate DESC
SELECT Category
dh 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 SELECT
Klausel enthalten ist, da es vorübergehend hinter den Kulissen hinzugefügt wird.
Warum funktioniert das nicht DISTINCT
?
Wenn wir die DISTINCT
Operation hinzufügen , wird sie zwischen SELECT
und 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 DISTINCT
Operation 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 .