在SQL Server中使用DISTINCT和GROUP BY

Vam*_*msi 14 sql-server group-by distinct

在SQL中使用DISTINCT和GROUP BY有什么目的吗?

下面是一个示例代码

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*der 17

用于从子句中DISTINCT删除重复项GROUPING SETSGROUP BY

GROUPING SETS()一般使用的完全愚蠢的示例(或特殊分组集ROLLUP()CUBE()特别是)中,您可以使用DISTINCT以便再次删除由分组集生成的重复值:

SELECT DISTINCT actors
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY CUBE(actors, actors)
Run Code Online (Sandbox Code Playgroud)

DISTINCT:

actors
------
NULL
a
b
Run Code Online (Sandbox Code Playgroud)

没有DISTINCT:

actors
------
a
b
NULL
a
b
a
b
Run Code Online (Sandbox Code Playgroud)

但是,为什么除了提出学术观点之外,你会这样做吗?

使用DISTINCT以找到独特的聚合函数值

在一个不太牵强的例子中,您可能对DISTINCT聚合值感兴趣,例如,有多少不同的演员重复数?

SELECT DISTINCT COUNT(*)
FROM (VALUES('a'), ('a'), ('b'), ('b')) t(actors)
GROUP BY actors
Run Code Online (Sandbox Code Playgroud)

回答:

count
-----
2
Run Code Online (Sandbox Code Playgroud)

使用DISTINCT与一个以上的删除重复GROUP BY

当然,另一个案例就是这样一个案例:

SELECT DISTINCT actors, COUNT(*)
FROM (VALUES('a', 1), ('a', 1), ('b', 1), ('b', 2)) t(actors, id)
GROUP BY actors, id
Run Code Online (Sandbox Code Playgroud)

DISTINCT:

actors  count
-------------
a       2
b       1
Run Code Online (Sandbox Code Playgroud)

没有DISTINCT:

actors  count
-------------
a       2
b       1
b       1
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,我写了一些博客文章,例如关于GROUPING SETS它们如何影响GROUP BY操作,或者关于SQL操作的逻辑顺序(与操作的词法顺序相反).


Ton*_*ony 5

我会在 a 中进行分组subselect,然后在 select 语句中采用不同的值:

SELECT DISTINCT *
FROM (  SELECT Actors
        FROM MovieDetails
        GROUP BY Actors
    ) d
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下为什么吗?该分组已经是唯一的。 (2认同)