从Group BY

时间:2016-02-04 13:31:18

标签: sql sql-server group-by

我想对从SQL 2012数据库返回的一些数据进行分组,我需要弄清楚如何在一定数量的字段上进行分组。

以下SQL工作正常

SELECT MessageId, SearchedString, COUNT(SearchedString) AS [SearchedStringCount], MAX(percentage) AS TopPercent
from (
select MessageId, SearchedString, Percentage
from  table
where MessageId = '15'
) T
GROUP BY MessageId, SearchedString

但是一旦我在select中添加了另一个字段,那么SQL就会要求它包含在group by中,这不是我需要的。

如何在上述SQL中添加其他字段,而不将其包含在Group By?

理想情况下,我希望包含一个Date值,如下所示:

select MessageId, SearchedString, COUNT(SearchedString) AS [SearchedStringCount], MAX(percentage) AS TopPercent, CAST(ScreenedDate AS DATE)        AS DateScreened
from (
select MessageId, SearchedString, Percentage, ScreenedDate
from  table
where MessageId = '15'
) T
GROUP BY MessageId, SearchedString

2 个答案:

答案 0 :(得分:0)

只需使用像max和min这样的聚合函数(即如果你想要一个随机的或者列总是相同的),就像这样:

select MessageId, SearchedString, COUNT(SearchedString) AS [SearchedStringCount], MAX(percentage) AS TopPercent, max(CAST(ScreenedDate AS DATE))       AS DateScreened
from (
select MessageId, SearchedString, Percentage, ScreenedDate
from  table
where MessageId = '15'
) T
GROUP BY MessageId, SearchedString

使用分组依据时,所有列(未汇总)必须包含在分组中。因此,如果您想要包含其他列,则有几个选项取决于您希望获得哪些结果。

选项1)列始终相同,max或min应覆盖它。

选项2)列不同但不管哪一个都不重要,max和min也应该涵盖这一点。

选项3)你必须选择一个特定的(如背后的东西),然后对于每个逻辑,答案将是不同的。

答案 1 :(得分:0)

使用SQL Server,您必须:

  • 选项1 :在SELECT列表中使用聚合

或:

  • 选项2 :在GROUP BY列表中添加非聚合列

其他数据库(例如MySQL)拥有他们所谓的扩展GROUP BY ,他们" ... 扩展GROUP BY的标准SQL使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列 ..."。在这种情况下,他们只返回"任何值"对于SELECT列表中未包含在GROUP BY中的非聚合列。只有当您确定 - 在您的查询中 - 选择列表中的所有非聚合列将返回相同的值时,这才有意义。

对于其他数据库(不是SQL Server),我编写了一个用户定义的函数(any_value()),只返回第一个检索到的值。如果选择选项1,它很有用,因为您不必浪费CPU周期来寻找您不需要的聚合。