Использование DISTINCT вместе с GROUP BY в SQL Server
есть ли цель для использования как DISTINCT, так и GROUP BY в SQL?
Ниже приведен пример кода
SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors
кто-нибудь знает о каких-либо ситуациях, когда необходимо использовать как отдельные, так и групповые, чтобы получить какие-либо конкретные желаемые результаты?
(общее использование DISTINCT и GROUP BY отдельно понимается)
2 ответов
использовать DISTINCT
удалить дубликаты GROUPING SETS
С GROUP BY
п.
в совершенно глупом примере с использованием GROUPING SETS()
в общем (или специальные наборы группировок ROLLUP()
или CUBE()
в частности), вы могли бы использовать DISTINCT
чтобы удалить повторяющиеся значения, созданные наборами группировок, снова:
SELECT DISTINCT actors
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY CUBE(actors, actors)
С DISTINCT
:
actors
------
NULL
a
b
без DISTINCT
:
actors
------
a
b
NULL
a
b
a
b
но почему, помимо академической точки зрения, ты это делаешь?
использовать DISTINCT
чтобы найти уникальные значения агрегатных функций
в менее надуманном примере вас может заинтересовать DISTINCT
статистические значения, такие как, сколько разные дублировать количество актеров есть?
SELECT DISTINCT COUNT(*)
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY actors
ответ:
count
-----
2
использовать DISTINCT
удалить дубликаты с более чем один GROUP BY
колонки
другой случай, конечно, это один:
SELECT DISTINCT actors, COUNT(*)
FROM (VALUES('a', 1), ('a', 1), ('b', 1), ('b', 2)) t(actors, id)
GROUP BY actors, id
С DISTINCT
:
actors count
-------------
a 2
b 1
без DISTINCT
:
actors count
-------------
a 2
b 1
b 1
для более подробной информации я написал несколько сообщений в блоге, например о GROUPING SETS
и как они влияют на GROUP BY
операция или о логическом порядке операций SQL (в отличие от лексического порядка операций).
возможно, не в том контексте, что у вас есть, но вы можете использовать
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
вы бы использовали это для возврата различных уровней агрегации, возвращаемых в одной строке. Вариант использования будет в том случае, когда одной группировки будет недостаточно для всех необходимых агрегатов.