Nach dem Ausführen der folgenden Anweisung:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Ich erhalte die folgenden Werte aus der Datenbank:
test3
test3
bildung
test4
test3
test2
test1
aber ich möchte, dass die Duplikate wie folgt entfernt werden:
bildung
test4
test3
test2
test1
Ich habe versucht, DISTINCT zu verwenden, aber es funktioniert nicht mit ORDER BY in einer Anweisung. Bitte helfen Sie.
Wichtig:
Ich habe es versucht mit:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
es funktioniert nicht
Die Bestellung nach CreationDate ist sehr wichtig.
Antworten:
Das Problem ist, dass die in der verwendeten Spalten in der
ORDER BY
nicht angegeben sindDISTINCT
. Dazu müssen Sie eine Aggregatfunktion verwenden, um zu sortieren, und eine verwendenGROUP BY
, um dieDISTINCT
Arbeit zu erledigen .Versuchen Sie so etwas:
quelle
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ügenORDER 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 zwischenSELECT
und hinzugefügtORDER BY
:FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Mit der erweiterten Sortierschlüsselspalte
CreationDate
wurde nun die Semantik derDISTINCT
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
Oder einfach (in diesem Fall), wie auch von Prutswonder gezeigt
Ich habe hier ausführlicher über SQL DISTINCT und ORDER BY gebloggt .
quelle
DISTINCT ON
und sind sich ziemlich sicher, dass es hier nicht hilft. Der Ausdruck in Klammern wird verwendet, um die Unterscheidbarkeit (die Gruppierungsbedingung) zu bestimmen. Wenn es verschiedene Kategorien mit derselben gibt,CreationDate
wird nur eine davon im Ergebnis angezeigt! Da ich mich gefragt habe, ob ich mich vielleicht irgendwie geirrt habe, habe ich auch die Beispieldatenbank in Ihren Blog-Beitrag geladen, um sie noch einmal zu überprüfen: DieDISTINCT ON
Abfrage, die Sie dort gaben, ergab insgesamt 1000 Ergebnisse (mit vielen Duplikatenlength
), während die Abfrage darunter ergab nur 140 (eindeutige) Werte.DISTINCT
(neinON
) verwendet, und eine, die verwendetDISTINCT ON
. Bitte beachten Sie, dass letztere explizit keine doppelten Längen, sondern doppelte Titel entfernt. Ich denke, dass meine Antwort hier völlig richtig ist.DISTINCT ON
Bedingungen Duplikate mit der falschen Bedingung entfernen. In Ihrem Blog-Beitrag entfernt dieDISTINCT ON
Abfrage zwar doppelte Titel , jedoch entfernen dieDISTINCT
darüber und die darunter liegende Abfrage (für die Sie behaupten, es sei "Syntaxzucker") doppelte Längen , da dies vermutlich das gesamte Ziel ist. Hier gilt das Gleiche: Das OP möchte, dass doppelte Kategorien entfernt werden, nicht doppelte Erstellungsdaten wie bei derDISTINCT ON
Abfrage. Wenn Sie mir immer noch nicht glauben, testen Sie es selbst.Wenn die Ausgabe von MAX (CreationDate) nicht gewünscht wird - wie im Beispiel der ursprünglichen Frage -, ist die einzige Antwort die zweite Aussage von Prashant Guptas Antwort:
Erläuterung: Sie können die ORDER BY-Klausel nicht in einer Inline-Funktion verwenden, daher ist die Anweisung in der Antwort von Prutswonder in diesem Fall nicht verwendbar. Sie können keine äußere Auswahl darum setzen und den MAX-Teil (CreationDate) verwerfen.
quelle
Verwenden Sie einfach diesen Code, wenn Sie Werte für die Spalten [Kategorie] und [Erstellungsdatum] wünschen
Oder verwenden Sie diesen Code, wenn Sie nur Werte der Spalte [Kategorie] möchten.
Sie haben alle unterschiedlichen Aufzeichnungen, was immer Sie wollen.
quelle
Event
, können Sie schreiben,[Event]
anstattEvent
zu verhindern, dass SQL einen Analysefehler auslöst.Die ursprünglichen Ergebnisse zeigten, dass "test3" mehrere Ergebnisse hatte ...
Es ist sehr einfach, MAX ständig zu verwenden, um Duplikate in Group By zu entfernen ... und die zugrunde liegende Frage zu vergessen oder zu ignorieren ...
Das OP erkannte vermutlich, dass die Verwendung von MAX ihm das letzte "erstellte" gab und die Verwendung von MIN das erste "erstellte" ...
quelle
MAX
als etwas, das als Antwort auf die Frage allein steht.quelle
Durch Unterabfrage sollte es funktionieren:
quelle
Distinct sortiert Datensätze in aufsteigender Reihenfolge. Wenn Sie in absteigender Reihenfolge sortieren möchten, verwenden Sie:
Wenn Sie Datensätze basierend auf dem Feld CreationDate sortieren möchten, muss sich dieses Feld in der select-Anweisung befinden:
quelle
Sie können CTE verwenden:
quelle
Versuchen Sie es als nächstes, aber es ist nicht nützlich für große Datenmengen ...
quelle
ORDER BY
in Unterabfragen ist absolut gültig. Und jemand hat sogar Ihren falschen Kommentar hochgestimmt.Dies kann mit einer inneren Abfrage wie dieser erfolgen
quelle
quelle