在SQL中使用GROUP BY - 仅限聚合?

时间:2011-09-08 05:58:54

标签: sql tsql group-by

GROUP BY仅用于聚合函数吗? 任何人都可以给出一个不与聚合函数一起使用的例子。

2 个答案:

答案 0 :(得分:7)

使用GROUP BY的SELECT可以用作SELECT DISTINCT的替代方法。 Pranay Rana的例子基本上等同于

SELECT DISTINCT UserName, Departmentid FROM user

如果你想要一个例子,其中GROUP BY优先于DISTINCT是合理的,这里是一个。比如,您想要返回仅在表中出现一次的项目:

SELECT Item
FROM atable
GROUP BY Item
HAVING COUNT(*) = 1

如您所见,查询仅返回非聚合列。

它仍然使用聚合函数,即使不在SELECT子句中也是如此。 可能是您必须首选GROUP BY到DISTINCT而不需要在所有上使用聚合函数的情况,但此时我必须是特定于平台的。< / p>

特别是,如果您使用的是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

#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

(如果不是,您仍然可以使用Stack Exchange Data Explorer查看自己的结果。)

这两个陈述都是为了返回排名的不同项目。但是,只有第一个语句(使用GROUP BY)按预期返回结果,而后者(使用DISTINCT)返回所有项。 显然,SQL Server中的排名函数是在GROUP BY之后,但在DISTINCT 之前评估的原因是,SELECT子句in SQL Server在GROUP BY之后,但在DISTINCT之前评估,这使你更喜欢GROUP在这种情况下通过DISTINCT。 (感谢@ypercube在正确的方向上推动我。)

答案 1 :(得分:4)

我没有应用任何聚合函数的东西

Select City,State from geodata group by City,State