Nachdem Sie die folgende Anweisung ausgeführt haben:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Ich erhalte folgende Werte aus der Datenbank:
test3
test3
bildung
test4
test3
test2
test1
aber ich möchte, dass die Duplikate 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.
Wichtig:
Ich habe es versucht mit:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
es funktioniert nicht.
Order by CreationDate ist sehr wichtig.
Das Problem ist, dass die in ORDER BY
verwendeten Spalten nicht in der DISTINCT
angegeben sind. Dazu müssen Sie eine Aggregat-Funktion zum Sortieren verwenden und einen GROUP BY
verwenden, damit die DISTINCT
funktioniert.
Versuchen Sie etwas so:
SELECT DISTINCT Category, MAX(CreationDate)
FROM MonitoringJob
GROUP BY Category
ORDER BY MAX(CreationDate) DESC, Category
Der Grund, warum das, was Sie tun möchten, nicht funktioniert, ist die logische Reihenfolge der Operationen in SQL , die für Ihre erste Abfrage (vereinfacht) lautet:
FROM MonitoringJob
SELECT Category, CreationDate
D. H. Hinzufügen einer sogenannten erweiterten Sortierschlüsselspalte ORDER BY CreationDate DESC
SELECT Category
D. H. Entfernen Sie die erweiterte Sortierschlüsselspalte erneut aus dem Ergebnis.Dank der SQL-Standardfunktion für erweiterte Sortierschlüsselspalten ist es also durchaus möglich, nach etwas zu sortieren, das nicht in SELECT
enthalten ist. Klausel, weil es vorübergehend hinter den Kulissen hinzugefügt wird.
DISTINCT
?Wenn wir die DISTINCT
-Operation hinzufügen, wird sie zwischen SELECT
und ORDER BY
Hinzugefügt:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Aber jetzt, mit der erweiterten Sortierschlüsselspalte CreationDate
, wurde die Semantik der DISTINCT
-Operation geändert Das Ergebnis wird nicht mehr dasselbe sein. Dies ist nicht das, was wir wollen, daher verbieten sowohl der SQL-Standard als auch alle vernünftigen Datenbanken diese Verwendung.
Es kann mit der folgenden Standardsyntax 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 durch 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 .
Wenn die Ausgabe von MAX (CreationDate) nicht erwünscht ist - wie im Beispiel der ursprünglichen Frage -, ist die einzige Antwort die zweite Aussage von Prashant Guptas Antwort:
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
Erläuterung: Sie können die ORDER BY-Klausel nicht in einer Inline-Funktion verwenden. In diesem Fall kann die Anweisung in der Antwort von Prutswonder nicht verwendet werden. Sie können sie nicht mit einem äußeren Auswahlbereich versehen und den MAX-Teil (CreationDate) verwerfen.
Verwenden Sie einfach diesen Code, wenn Sie Werte für die Spalten [Category] und [CreationDate] wünschen
SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
Oder verwenden Sie diesen Code, wenn Sie nur Werte der Spalte [Kategorie] wünschen.
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
Sie haben alle verschiedenen Datensätze, was immer Sie wollen.
2) Order by CreationDate ist sehr wichtig
Die ursprünglichen Ergebnisse zeigten, dass "test3" mehrere Ergebnisse hatte ...
Es ist sehr einfach, mit MAX die ganze Zeit zu beginnen, um Duplikate in Group By zu entfernen. Vergessen oder ignorieren Sie die zugrunde liegende Frage ...
Vermutlich wurde dem OP klar, dass mit MAX das letzte "erstellt" und mit MIN das erste "erstellt" wurde ...
if object_id ('tempdb..#tempreport') is not null
begin
drop table #tempreport
end
create table #tempreport (
Category nvarchar(510),
CreationDate smallint )
insert into #tempreport
select distinct Category from MonitoringJob (nolock)
select * from #tempreport ORDER BY CreationDate DESC
Distinct sortiert Datensätze in aufsteigender Reihenfolge. Wenn Sie in absteigender Reihenfolge sortieren möchten, verwenden Sie:
SELECT DISTINCT Category
FROM MonitoringJob
ORDER BY Category DESC
Wenn Sie Datensätze nach CreationDate-Feld sortieren möchten, muss dieses Feld in der Select-Anweisung enthalten sein:
SELECT DISTINCT Category, creationDate
FROM MonitoringJob
ORDER BY CreationDate DESC
Nach Unterabfrage sollte es funktionieren:
SELECT distinct(Category) from MonitoringJob where Category in(select Category from MonitoringJob order by CreationDate desc);
Sie können CTE verwenden:
WITH DistinctMonitoringJob AS (
SELECT DISTINCT Category Distinct_Category FROM MonitoringJob
)
SELECT Distinct_Category
FROM DistinctMonitoringJob
ORDER BY Distinct_Category DESC