首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合SQL请求的Order子句

聚合SQL请求的Order子句
EN

Stack Overflow用户
提问于 2011-07-13 23:47:14
回答 5查看 524关注 0票数 0

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

代码语言:javascript
复制
MyTable (table name)
ID - int (unique, auto increment)
Message - string
Timestamp - Datetime

--我想选择ID的数量,按消息分组,然后按时间戳对它们进行排序,所以我将这样做:

代码语言:javascript
复制
SELECT count (ID), Message FROM MyTable
GROUP BY (Message)
ORDER BY Timestamp desc

但是,Server管理演播室会抛出此错误:

代码语言:javascript
复制
Column 'Timestamp ' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

问题是,如果我在grouping中添加了带有消息的时间戳,那么它就会破坏我的分组。在聚合函数中放置时间戳的另一项建议没有意义(按顺序排列,计数(时间戳)并不意味着什么.)

知道怎么做吗?

非常感谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-13 23:56:36

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

代码语言:javascript
复制
       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

并且要按消息字符串进行分组,计算消息出现在表中的次数:

代码语言:javascript
复制
      the mackerel likes frying|2
      at night all cats are grey|1

时间戳列不是聚合(也就是分组)的一部分,而是详细信息行的一部分。它不能出现在分组中,因为时间戳不是" It“(单数),而是时间戳,它们是复数的。上面的示例中有两个不同的时间标记用于mackerel消息。你会选哪一个?查询如何知道它是哪一个?您所拥有的只有聚合函数:

代码语言:javascript
复制
        min(timestamp)
        max(timestamp)
        count(timestamp)

如果它不是一个日期时间,您也会有AVG(时间戳)。

票数 1
EN

Stack Overflow用户

发布于 2011-07-13 23:52:03

找这样的东西?

代码语言:javascript
复制
SELECT Message, count (ID), max(Timestamp) as maxDate FROM MyTable
GROUP BY (Message)
ORDER BY maxDate desc
票数 2
EN

Stack Overflow用户

发布于 2011-07-13 23:53:04

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6686991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档