在 MySQL 中聚合/分组一组行/记录
Posted
技术标签:
【中文标题】在 MySQL 中聚合/分组一组行/记录【英文标题】:Aggregating/Grouping a set of rows/records in MySQL 【发布时间】:2014-06-27 12:43:55 【问题描述】:我有一个表说“样本”,它每五分钟保存一条新记录。 用户可能会要求收集特定采样间隔(例如 10 分钟或 30 分钟或一小时)的数据。
由于我每五分钟就有一条记录,因此当用户要求以一小时的采样间隔提供数据时,我将不得不将每 12 (60/5) 条记录合并/分组为一条记录(已根据时间排序-stamp),标准可以是最小/最大/平均/最后一个值。
我在获取所有记录后尝试在 Java 中执行此操作,并且由于我必须多次遍历集合而看到性能非常差,我已经阅读了其他替代方法,例如 jAgg 和 lambdaj,但想检查一下如果这在 SQL (mysql) 本身中是可能的。
采样间隔是动态的,聚合函数(min/max/avg/last)也是用户提供的。
任何指针?
【问题讨论】:
【参考方案1】:您可以在 SQL 中执行此操作,但您必须仔细构造语句。以下是所有四个聚合的小时示例:
select min(datetime) as datetime,
min(val) as minval, max(val) as maxval, avg(val) as avgval,
substring_index(group_concat(val order by datetime desc), ',', 1) as lastval
from table t
group by floor(to_seconds(datetime) / (60*60));
【讨论】:
谢谢 Gordon,但这意味着我们只会得到一条记录,因为我们是按时间分组的,但是如果我的表中有 1200 条记录,我应该输出值(最小/最大/avg/last) 为 1200 条记录中的每 12 条记录,因此,应该得到 100 条记录作为输出。我说得有道理吗? @Sandeep 。 . .并不真地。这将按书面形式每小时输出一条记录。这似乎是你所要求的。 我的错,列类型不是日期时间,而是 BIG INT 并且是纪元时间,也是毫秒,所以现在只得到一行,非常感谢戈登!!跨度>以上是关于在 MySQL 中聚合/分组一组行/记录的主要内容,如果未能解决你的问题,请参考以下文章