用于识别 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 分钟间隔