Использование 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

вы бы использовали это для возврата различных уровней агрегации, возвращаемых в одной строке. Вариант использования будет в том случае, когда одной группировки будет недостаточно для всех необходимых агрегатов.