【问题标题】:Remove select fields from Group BY从 Group BY 中删除选择字段
【发布时间】:2016-02-04 21:51:17
【问题描述】:

我想对从 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

但只要我在选择中添加另一个字段,SQL 就会要求将其包含在 group by 中,这不是我需要的。

如何在不包含在 Group By 中的情况下向上述 SQL 添加另一个字段?

理想情况下,我希望包含一个 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

【问题讨论】:

  • 假设同一个(MessageId, SearchedString)分组有多个ScreenedDate...服务器应该返回哪个日期?
  • 嗨,Matteo,每条筛选消息都有一个日期。我将日期转换为删除所有毫秒,这样它们的日期实际上是相同的。
  • 那么您实际上可以将其添加到 group by 子句中而不会产生附带影响,同时遵守 SQL 标准......或者按照建议使用聚合函数。

标签: sql sql-server group-by


【解决方案1】:

只需使用像 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

当您使用 group by 时,所有列(未聚合的)都必须包含在 group by 部分中。因此,如果您希望包含另一列,则有几个选项取决于您想要获得的结果。

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

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

而选项 3)你必须选择一个特定的(比如 lalats 或其他东西),然后对于每个逻辑,答案都会不同。

【讨论】:

    【解决方案2】:

    使用 SQL Server 您有义务:

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

    或:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      相关资源
      最近更新 更多