【问题标题】:Aggregating/Grouping a set of rows/records in MySQL在 MySQL 中聚合/分组一组行/记录
【发布时间】:2014-06-27 12:43:55
【问题描述】:

我有一个表说“样本”,它每五分钟保存一条新记录。 用户可能会要求收集特定采样间隔(例如 10 分钟或 30 分钟或一小时)的数据。

由于我每五分钟就有一条记录,因此当用户要求以一小时的采样间隔提供数据时,我将不得不将每 12 (60/5) 条记录合并/分组为一条记录(已根据时间排序-stamp),标准可以是最小/最大/平均/最后一个值。

我在获取所有记录后尝试在 Java 中执行此操作,并且由于我必须多次遍历集合而看到性能非常差,我已经阅读了其他替代方法,例如 jAgg 和 lambdaj,但想检查一下如果这在 SQL (MySQL) 本身中是可能的。

采样间隔是动态的,聚合函数(min/max/avg/last)也是用户提供的。

任何指针?

【问题讨论】:

    标签: mysql sql


    【解决方案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 并且是纪元时间,也是毫秒,所以现在只得到一行,非常感谢戈登!!跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多