在 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 在一行中编辑。用例适用于当单个分组不足以满足所需的所有聚合时。
使用 DISTINCT
从 GROUP 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
在 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 在一行中编辑。用例适用于当单个分组不足以满足所需的所有聚合时。
使用 DISTINCT
从 GROUP 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