聚合SQL请求上的Order By子句

聚合SQL请求上的Order By子句,sql,sql-server,Sql,Sql Server,假设我的表模式类似于bellow(这只是一个简化的示例): 我想选择ID的编号,按消息分组并按时间戳排序,因此我将执行以下操作: SELECT count (ID), Message FROM MyTable GROUP BY (Message) ORDER BY Timestamp desc 但是,SQL Server management studio向我抛出以下错误: Column 'Timestamp ' is invalid in the select list because it

假设我的表模式类似于bellow(这只是一个简化的示例):

我想选择ID的编号,按消息分组并按时间戳排序,因此我将执行以下操作:

SELECT count (ID), Message FROM MyTable
GROUP BY (Message)
ORDER BY Timestamp desc
但是,SQL Server management studio向我抛出以下错误:

Column 'Timestamp ' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
问题是,如果我将时间戳放在带有消息的GROUPBY语句中,就会弄乱分组。在聚合函数中放置时间戳的另一个建议没有意义(按计数排序(Timestamp)没有任何意义…)

你知道怎么做吗


非常感谢

想找这样的东西吗

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

在找这样的东西吗

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

如果要根据组内的最大时间戳对邮件进行排序,请尝试:

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

如果要根据组内的最大时间戳对邮件进行排序,请尝试:

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

当您进行聚合时,您是基于某些条件将行分组在一起。这意味着结果集的每一行实际上代表原始数据中的多行

当您希望按时间戳排序时,结果集中的每一行都有多个时间戳值,因为这些行中的每一行都代表多行数据


因此,您需要决定每个集合需要哪个
时间戳。
MAX
MIN
?您还需要聚合该字段,以获得准确或有意义的结果。

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

当您希望按时间戳排序时,结果集中的每一行都有多个时间戳值,因为这些行中的每一行都代表多行数据


因此,您需要决定每个集合需要哪个
时间戳。
MAX
MIN
?您还需要聚合该字段以获得准确或有意义的结果。

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

       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
时间戳列不是分组聚合的一部分,而是详细信息行的一部分。它不能出现在分组中,因为时间戳不是“It”(单数),而是时间戳,它们是复数。在上面的示例中,mackerel消息有两个不同的时间戳。你会选择哪一个?查询如何知道它是哪一个?所有可供您使用的是聚合函数:

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

如果不是datetime,您也会有AVG(时间戳)。

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

       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
时间戳列不是分组聚合的一部分,而是详细信息行的一部分。它不能出现在分组中,因为时间戳不是“It”(单数),而是时间戳,它们是复数。在上面的示例中,mackerel消息有两个不同的时间戳。你会选择哪一个?查询如何知道它是哪一个?所有可供您使用的是聚合函数:

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

如果不是datetime,您还需要AVG(时间戳)。

这里的问题是,您可能有多条相同但时间戳不同的消息,因为您是按消息分组的。如果您有两条具有不同时间戳的消息“hello”,那么order by应该使用哪条消息

这是一种方式。您还可以使用交叉应用或行号来执行一个技巧

选择计数(ID),MyTable中的消息 分组依据(消息)
ORDER BY Max(Timestamp)desc这里的问题是您可能有多条相同但时间戳不同的消息,因为您是按消息分组的。如果您有两条具有不同时间戳的消息“hello”,那么order by应该使用哪条消息

这是一种方式。您还可以使用交叉应用或行号来执行一个技巧

选择计数(ID),MyTable中的消息 分组依据(消息)
按Max(Timestamp)desc排序

确认我是否理解你的例子:如果我按Max(Timestamp)desc对你的行进行分组,结果会是:2 |晚上所有的猫都是灰色的| 1956年12月15日,3 |鲭鱼喜欢炸| 1918年2月2日,1 |鲭鱼喜欢炸| 1917年1月1日?@Tigel-不会,因为第1行和第3行会被分组在一起。当然,我的错了。我现在明白了,谢谢你们的回答,先生们@JNK@Cybernate@ingo@Devin GarnerTo确认我是否理解你的例子:如果我按max(时间戳)desc对你的行进行分组,结果会是:2 |晚上所有的猫都是灰色的| 1956年12月15日,3 |鲭鱼喜欢炸| 1918年2月2日,1 |鲭鱼喜欢炸| 1917年1月1日?@Tigel-不会,因为第1行和第3行会被分组在一起。当然,我的错了。我现在明白了,谢谢你们的回答,先生们@JNK@Cybernate@ingo@Devin Garner