在SQL Server中使用DISTINCT和GROUP BY

时间:2015-09-21 18:35:54

标签: sql-server group-by distinct

在SQL中使用DISTINCT和GROUP BY是否有任何目的?

以下是示例代码

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors

是否有人知道需要使用DISTINCT和GROUP BY的任何情况,以获得任何特定的预期结果?

(分别理解DISTINCT和GROUP BY的一般用法)

2 个答案:

答案 0 :(得分:11)

使用DISTINCTGROUPING 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

有关详情,我写过一些博文,例如: about GROUPING SETS and how they influence the GROUP BY operationabout the logical order of SQL operations (as opposed to the lexical order of operations)

答案 1 :(得分:0)

也许不是在您拥有它的情况下,但您可以使用

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

您可以使用它来返回单行返回的不同聚合级别。用例是指单个分组不足以满足所有需要的聚合。