在SQL中使用DISTINCT和GROUP BY是否有任何目的?
以下是示例代码
SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors
是否有人知道需要使用DISTINCT和GROUP BY的任何情况,以获得任何特定的预期结果?
(分别理解DISTINCT和GROUP BY的一般用法)
答案 0 :(得分:11)
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
有关详情,我写过一些博文,例如: about GROUPING SETS
and how they influence the GROUP BY
operation或about 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
您可以使用它来返回单行返回的不同聚合级别。用例是指单个分组不足以满足所有需要的聚合。