有关聚合SQL请求的Order By子句

时间:2011-07-13 23:47:14

标签: sql sql-server

让我们说我的表架构就像下面一样(这只是一个简化的例子):

MyTable (table name)
ID - int (unique, auto increment)
Message - string
Timestamp - Datetime

我想选择ID的数量,按消息对它们进行分组并按时间戳排序,所以我会做这样的事情:

SELECT count (ID), Message FROM MyTable
GROUP BY (Message)
ORDER BY Timestamp desc

然而,SQL Server管理工作室抛出了这个错误:

Column 'Timestamp ' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

问题在于,如果我将Timestamp放在带有Message的Group By语句中,它会混淆我的分组。将Timestamp放在聚合函数中的另一个建议是没有意义的(按顺序排序,count(Timestamp)并不意味着什么...)

关于如何做到这一点的任何想法?

非常感谢!

5 个答案:

答案 0 :(得分:2)

寻找这样的东西?

SELECT Message, count (ID), max(Timestamp) as maxDate FROM MyTable
GROUP BY (Message)
ORDER BY maxDate desc

答案 1 :(得分:2)

进行聚合时,您会根据特定条件将GROUP行放在一起。这意味着结果集的每一行实际上代表原始数据中的多行。

当您想要ORDER BY Timestamp时,结果集中的每一行都会有 MULTIPLE timestamp值,因为这些行中的每一行都代表几行数据。

因此,您需要确定每个集合所需的timestampMAXMIN?您还需要聚合该字段以获得准确或有意义的结果。

答案 2 :(得分:1)

如果您想根据群组中的最大时间戳订购消息,请尝试:

SELECT count (ID), Message 
  FROM MyTable
 GROUP BY (Message)
 ORDER BY MAX(Timestamp) DESC

答案 3 :(得分:1)

假设您的表中多次出现相同的消息:

       1|the mackerel likes frying|1/1/1917
       2|at night all cats are grey|12/15/1956
       3|the mackerel likes frying|2/2/1918

您希望按消息字符串分组,计算消息在表格中出现的次数:

      the mackerel likes frying|2
      at night all cats are grey|1

时间戳列不是聚合的一部分,也就是分组,但它是详细信息行的一部分。它不能出现在分组中,因为时间戳不是“它”(单数)而是时间戳,它们是复数。上面的示例中有两个不同的时间戳用于mackerel消息。你会选哪一个?查询将如何知道它是哪一个?您可以随意使用的是集合功能:

        min(timestamp)
        max(timestamp)
        count(timestamp)

如果它不是日期时间,你也有AVG(时间戳)。

答案 4 :(得分:0)

这里的问题是您可能有多条相同但有不同时间戳的消息,因为您按消息分组。如果你有两条带有不同时间戳的消息'hello',它应该用于订单吗?

这是一种方式。你也可以用cross apply或row_number做一个技巧。

SELECT count(ID),Message FROM MyTable GROUP BY(消息) ORDER BY Max(时间戳)desc