我想对从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
答案 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,您必须:
或:
其他数据库(例如MySQL)拥有他们所谓的扩展GROUP BY ,他们" ... 扩展GROUP BY的标准SQL使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列 ..."。在这种情况下,他们只返回"任何值"对于SELECT列表中未包含在GROUP BY中的非聚合列。只有当您确定 - 在您的查询中 - 选择列表中的所有非聚合列将返回相同的值时,这才有意义。
对于其他数据库(不是SQL Server),我编写了一个用户定义的函数(any_value()),只返回第一个检索到的值。如果选择选项1,它很有用,因为您不必浪费CPU周期来寻找您不需要的聚合。