it-swarm.com.de

Verwenden von DISTINCT zusammen mit GROUP BY in SQL Server

Gibt es einen Zweck für die Verwendung von DISTINCT und GROUP BY in SQL?

Unten ist ein Beispielcode

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors

Kennt jemand Situationen, in denen sowohl DISTINCT als auch GROUP BY verwendet werden müssen, um bestimmte gewünschte Ergebnisse zu erzielen?

(Die allgemeine Verwendung von DISTINCT und GROUP BY wird separat verstanden.)

13
Vamsi

Verwenden Sie DISTINCT, um das doppelte GROUPING SETS Aus der GROUP BY - Klausel zu entfernen

In einem völlig albernen Beispiel mit GROUPING SETS() im Allgemeinen (oder den speziellen Gruppierungssätzen ROLLUP() oder CUBE() im Besonderen) könnten Sie DISTINCT in verwenden Um die von den Gruppierungssätzen erzeugten doppelten Werte wieder zu entfernen:

SELECT DISTINCT actors
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY CUBE(actors, actors)

Mit DISTINCT:

actors
------
NULL
a
b

Ohne DISTINCT:

actors
------
a
b
NULL
a
b
a
b

Aber warum, abgesehen von einem akademischen Punkt, würden Sie das tun?

Verwenden Sie DISTINCT, um eindeutige Aggregatfunktionswerte zu finden

In einem weniger weit hergeholten Beispiel könnten Sie an den DISTINCT aggregierten Werten interessiert sein, z. B. wie viele verschiedene doppelte Anzahlen von Schauspieler sind da?

SELECT DISTINCT COUNT(*)
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY actors

Antworten:

count
-----
2

Verwenden Sie DISTINCT, um Duplikate mit mehr als einer GROUP BY - Spalte zu entfernen

Ein anderer Fall ist natürlich dieser:

SELECT DISTINCT actors, COUNT(*)
FROM (VALUES('a', 1), ('a', 1), ('b', 1), ('b', 2)) t(actors, id)
GROUP BY actors, id

Mit DISTINCT:

actors  count
-------------
a       2
b       1

Ohne DISTINCT:

actors  count
-------------
a       2
b       1
b       1

Für weitere Details habe ich einige Blog-Posts geschrieben, z. über GROUPING SETS und wie sie die GROUP BY - Operation beeinflussen oder über die logische Reihenfolge von SQL-Operationen (im Gegensatz zur lexikalischen Reihenfolge von Operationen) .

16
Lukas Eder

Vielleicht nicht in dem Kontext, in dem Sie es haben, aber Sie könnten es verwenden

SELECT DISTINCT col1,
PERCENTILE_CONT(col2) WITHIN GROUP (ORDER BY col2) OVER (PARTITION BY col1),
PERCENTILE_CONT(col2) WITHIN GROUP (ORDER BY col2) OVER (PARTITION BY col1, col3),
FROM TableA

Sie würden dies verwenden, um verschiedene Aggregationsebenen zurückzugeben, die in einer einzelnen Zeile zurückgegeben werden. Der Anwendungsfall wäre, wenn eine einzelne Gruppierung nicht alle benötigten Aggregate ausreichen würde.

0
Brad D