web-dev-qa-db-fra.com

Utilisation de DISTINCT avec GROUP BY dans SQL Server

Est-il utile d'utiliser à la fois DISTINCT et GROUP BY dans SQL?

Voici un exemple de code

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors

Quelqu'un connaît-il des situations où DISTINCT et GROUP BY doivent être utilisés pour obtenir les résultats souhaités spécifiques?

(L'utilisation générale de DISTINCT et GROUP BY séparément est comprise)

13
Vamsi

Utilisez DISTINCT pour supprimer le double GROUPING SETS De la clause GROUP BY

Dans un exemple complètement stupide utilisant GROUPING SETS() en général (ou les ensembles de regroupement spéciaux ROLLUP() ou CUBE() en particulier), vous pouvez utiliser DISTINCT dans afin de supprimer à nouveau les valeurs en double produites par les ensembles de regroupement:

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

Avec DISTINCT:

actors
------
NULL
a
b

Sans DISTINCT:

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

Mais pourquoi, en plus de faire un point académique, le feriez-vous?

Utilisez DISTINCT pour trouver des valeurs de fonction d'agrégation uniques

Dans un exemple moins farfelu, vous pourriez être intéressé par les valeurs agrégées DISTINCT, telles que le nombre de doublons différents de les acteurs sont là?

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

Répondre:

count
-----
2

Utilisez DISTINCT pour supprimer les doublons avec plusieurs colonnes GROUP BY

Un autre cas, bien sûr, est celui-ci:

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

Avec DISTINCT:

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

Sans DISTINCT:

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

Pour plus de détails, j'ai écrit quelques articles de blog, par exemple sur GROUPING SETS et comment ils influencent l'opération GROUP BY , ou sur l'ordre logique des opérations SQL (par opposition à l'ordre lexical des opérations) .

16
Lukas Eder

Peut-être pas dans le contexte que vous avez, mais vous pouvez utiliser

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

Vous l'utiliseriez pour renvoyer différents niveaux d'agrégation renvoyés sur une seule ligne. Le cas d'utilisation serait celui où un seul regroupement ne suffirait pas à tous les agrégats nécessaires.

0
Brad D