【问题标题】:Function to identify records that are within 5 minute intervals用于识别 5 分钟间隔内的记录的功能
【发布时间】:2020-01-09 18:38:47
【问题描述】:

我有一个包含许多记录的 MYSQL 表,如下图所示。

例如,我需要识别 5 分钟间隔内的行,并在该行在 5 分钟内的新列中标记每一行。请参阅输出示例。

如何通过函数做到这一点?

【问题讨论】:

  • 第一个间隔何时开始?当下一个 5 分钟间隔开始时 - 前一个间隔的强烈开始 + 5 分钟或最少时间超出前一个间隔?并指定 MySQL 版本。
  • 第一个 5 分钟间隔从表中的第一条记录开始。第一个间隔 5 分钟后,下一个间隔开始,依此类推。 MYSQL的版本是8。

标签: mysql sql


【解决方案1】:

测试

WITH RECURSIVE
cte AS ( SELECT MIN(`datetime`) AS dt_start, 
                MIN(`datetime`) + INTERVAL 5 MINUTE AS dt_end,
                1 AS group_num
         FROM sourcetable
         UNION ALL
         SELECT dt_end,
                dt_end + INTERVAL 5 MINUTE,
                group_num + 1
         FROM cte
         WHERE dt_end <= ( SELECT MAX(`datetime`)
                           FROM sourcetable )
       )
SELECT sourcetable.*, cte.group_num
FROM sourcetable
JOIN cte ON `datetime` >= dt_start
        AND `datetime` < dt_end

【讨论】:

  • 谢谢。我会测试并报告结果。
  • @MarcelinoSantos 如果是这样,请将您的问题标记为已解决。
【解决方案2】:

如果您的 5 分钟间隔是基于日历时间,那么最有效的方法是使用窗口函数:

select t.*,
       dense_rank() over (order by to_seconds(floor(data / 300))) as tr
from t;

如果它基于每个组中第一条记录的开始时间,那么您需要按照 Akina 的建议进行递归 CTE。

【讨论】:

  • 如果您的 5 分钟间隔基于日历时间 OP 说 第一个 5 分钟间隔从表中的第一条记录开始。 .见 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
相关资源
最近更新 更多