wake-up-neo.com

Wie verwende ich DISTINCT und ORDER BY in derselben SELECT-Anweisung?

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:

  1. Ich habe es versucht mit:

    SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
    

    es funktioniert nicht.

  2. Order by CreationDate ist sehr wichtig.

84
r.r

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
145
Prutswonder

Erweiterte Sortierschlüsselspalten

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.

Warum funktioniert das nicht mit 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.

Problemumgehungen

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 .

9
Lukas Eder

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.

4
Marc_Sei

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
Prashant Gupta

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 ...

1
JohnSurrey
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
0
Bob

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
0
C Patel

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
0
Jair