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)
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?
DISTINCT
pour trouver des valeurs de fonction d'agrégation uniquesDans 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
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) .
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.