用于识别 5 分钟间隔内的记录的功能

Posted

技术标签:

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

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

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

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

【问题讨论】:

第一个间隔何时开始?当下一个 5 分钟间隔开始时 - 前一个间隔的强烈开始 + 5 分钟或最少时间超出前一个间隔?并指定 MySQL 版本。 第一个 5 分钟间隔从表中的第一条记录开始。第一个间隔 5 分钟后,下一个间隔开始,依此类推。 MYSQL的版本是8。 【参考方案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。

以上是关于用于识别 5 分钟间隔内的记录的功能的主要内容,如果未能解决你的问题,请参考以下文章

将 DateTime 分组为 5、15、30 和 60 分钟间隔

时间间隔内的 SQL 计数

在 Oracle SQL 中按时间间隔聚合数据

使用oracle,如何做到某个时间段内每间隔1分钟查询出一条记录?

返回用户输入日期之前用户输入时间间隔内的所有记录

以 5 分钟为间隔对 DataFrame 进行分组