SELECT BY GROUP BY可用作SELECT DISTINCT的替代方法.Pranay Rana的例子基本上相当于
SELECT DISTINCT UserName, Departmentid FROM user
Run Code Online (Sandbox Code Playgroud)
如果你想要一个例子,其中GROUP BY优先于DISTINCT是合理的,这里是一个.比如说,您想要返回仅在表中出现一次的项目:
SELECT Item
FROM atable
GROUP BY Item
HAVING COUNT(*) = 1
Run Code Online (Sandbox Code Playgroud)
如您所见,查询仅返回非聚合列.
尽管如此,它仍然使用聚合函数,即使不在SELECT子句中也是如此.有可能是,你必须喜欢GROUP BY到DISTINCT,同时不需要使用聚合函数的情况下,在所有的,但我必须要具体在这一点上平台.
特别是,如果您使用的是SQL Server,您会发现以下两个语句的结果之间存在差异:
#1:
WITH data (f) AS (
SELECT 'abc' UNION ALL
SELECT 'def' UNION ALL
SELECT 'abc'
)
SELECT f, ROW_NUMBER() OVER (ORDER BY f) FROM data GROUP BY f
Run Code Online (Sandbox Code Playgroud)
#2:
WITH data (f) AS (
SELECT 'abc' UNION ALL
SELECT 'def' UNION ALL
SELECT 'abc'
)
SELECT DISTINCT f, ROW_NUMBER() OVER (ORDER BY f) FROM data
Run Code Online (Sandbox Code Playgroud)
(如果不是,您仍然可以使用Stack Exchange Data Explorer自行查看结果.)
这两个语句都是为了返回排名的不同项目.但是,只有第一个语句(使用GROUP BY)按预期返回结果,而后者(使用DISTINCT)返回所有项目.显然,SQL Server中的排名函数是在GROUP BY之后但在DISTINCT之前评估的原因是,SQL Server中的SELECT子句是在GROUP BY之后但在DISTINCT之前评估的,这使得在这种情况下你更喜欢GROUP BY而不是DISTINCT.(感谢@ypercube向我推进正确的方向.)