web-dev-qa-db-ja.com

SQL ServerでGROUP BYとともにDISTINCTを使用する

SQLでDISTINCTとGROUP BYの両方を使用する目的はありますか?

以下はサンプルコードです

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors

特定の望ましい結果を得るために、DISTINCTとGROUP BYの両方を使用する必要がある状況を知っている人はいますか?

(DISTINCTとGROUP BYの一般的な使用法は別々に理解されています)

13
Vamsi

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集計値に興味があるかもしれません。たとえば、アクターの重複数differentある?

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

回答:

_count
-----
2
_

DISTINCTを使用して、複数の_GROUP BY_列を持つ重複を削除します

もちろん、もう1つのケースは次のとおりです。

_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操作の論理的順序(操作の字句順ではなく)

16
Lukas Eder

おそらくあなたがそれを持っているという文脈ではありませんが、あなたは使うことができます

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

これを使用して、単一行で返されるさまざまなレベルの集計を返します。ユースケースは、単一のグループ化では必要なすべての集計を満たさない場合に使用します。

0
Brad D