让我们说我的表架构就像下面一样(这只是一个简化的例子):
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)并不意味着什么...)
关于如何做到这一点的任何想法?
非常感谢!
答案 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
值,因为这些行中的每一行都代表几行数据。
因此,您需要确定每个集合所需的timestamp
。 MAX
? MIN
?您还需要聚合该字段以获得准确或有意义的结果。
答案 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