【问题标题】:Mysql average of data not further than 3 minutes apartMysql平均数据间隔不超过3分钟
【发布时间】:2021-04-27 21:10:17
【问题描述】:

我正在尝试创建一个查询,平均相隔不超过 3 分钟的数据行。当然,没有必要像图像中那样,行相隔 2 秒。

那么我怎样才能选择这样一个时期内的行并获得该时期内例如“engine_load”的平均值。

根据图像中的示例,我需要 ids 19428-19431 的数据和 19423-19427 的数据作为平均值。例如,如果存在日期时间为 2021-04-27 12:25:15 的行,则该行将是他的“期间”中的唯一行,因为没有任何其他行接近 3 分钟。

【问题讨论】:

  • 如果数据可以匹配多个组会怎样?例如第 1 行 = 12:00,第 2 行 = 12:02,第 3 行 = 12:04。第 2 行会包含在第 1 行、第 3 行、两者中还是两者中?
  • 通常不会有可以匹配多个组的数据。

标签: mysql sql mariadb


【解决方案1】:

如果您将 breaks 定义为三分钟,那么您可以使用 lag() 然后使用累积总和来定义组:

select min(id), max(id), min(datetime), max(datetime),
       avg(engine_load)
from (select t.*,
             sum(case when prev_datetime > datetime - interval 3 minute then 0 else 1 end) over (order by datetime) as grp
      from (select t.*,
                   lag(datetime) over (order by datetime) as prev_datetime
            from t
           ) t
     ) t
group by grp;

【讨论】:

  • 已经谢谢了,但我使用的 MySQL 版本似乎不支持 lag(),因为它给了我一个语法错误。由于我无法控制服务器,我也无法更新它。
【解决方案2】:

由于您无法像 Gordon Linoff 的出色回答那样使用 lag,并且您在 cmets 中确认组不可能重叠,您可能可以尝试以下方法:

SELECT mindatetime, MAX(datetime) maxdatetime, avg(engine_load)
FROM
(
 SELECT (SELECT MIN(m2.datetime) FROM mytable m2 WHERE m2.datetime > DATE_SUB(m1.datetime, INTERVAL 3 MINUTE)) mindatetime, m1.datetime, m1.engine_load
 FROM mytable m1
) mt
GROUP BY mindatetime

内部查询只获取每一行,加上日期时间在该行 3 分钟内的最小行。外部查询按该最短日期时间分组并取平均值。

这实际上取决于没有重叠的事实,否则不会给您预期的结果。您还需要确认> 是否比>= 更合适(行是否可以正好相隔3 分钟以及应该如何工作)。

【讨论】:

  • 感谢您的解释。可能是我从您的评论中误解了“组”。因此,如果我现在得到它,它肯定会包含在两个组中。对困惑感到抱歉。你的代码给了我很多行,即使它们在 3 分钟内:i.imgur.com/xocJGy3.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2015-07-05
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多