在 SQL 服务器中使用 DISTINCT 和 GROUP BY

Using DISTINCT along with GROUP BY in SQL Server

在 SQL 中同时使用 DISTINCT 和 GROUP BY 有什么用吗?

下面是示例代码

SELECT DISTINCT Actors
FROM MovieDetails
GROUP BY Actors

有谁知道在任何情况下需要同时使用 DISTINCT 和 GROUP BY 以获得任何特定的期望结果?

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

也许不在你拥有它的上下文中,但你可以使用

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

您可以使用它 return 不同级别的聚合 return 在一行中编辑。用例适用于当单个分组不足以满足所需的所有聚合时。

使用 DISTINCTGROUP BY 子句中删除重复的 GROUPING SETS

在一个完全愚蠢的示例中,通常使用 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, or about the logical order of SQL operations (as opposed to the lexical order of operations).

我会在 subselect 中分组,然后在 select 语句中进行区分:

SELECT DISTINCT *
FROM (  SELECT Actors
        FROM MovieDetails
        GROUP BY Actors
    ) d