MySQL按30分钟时间间隔查询数据(无需GROUP BY)实现方法咨询
按30分钟间隔查询MySQL数据(无需GROUP BY)
嘿,刚好我之前处理过类似的需求,不用GROUP BY也能实现按30分钟间隔取数的效果,分两种常见场景给你拆解:
场景1:筛选相邻记录间隔≥30分钟的结果
如果你想要的是从数据里挑出前后两条记录时间差至少30分钟的条目(保留第一条数据),可以用窗口函数LAG()来实现:
SELECT * FROM ( SELECT *, -- 计算当前记录与上一条记录的时间差(分钟) TIMESTAMPDIFF(MINUTE, LAG(record_time) OVER (ORDER BY record_time), record_time) AS diff_minutes FROM your_table -- 替换成你的表名 ) t -- 保留第一条数据(diff_minutes为NULL)和间隔≥30分钟的记录 WHERE diff_minutes >= 30 OR diff_minutes IS NULL;
逻辑说明:
LAG(record_time) OVER (ORDER BY record_time):按时间排序后,获取当前记录的上一条记录的时间TIMESTAMPDIFF:计算两条记录的时间差(单位为分钟)- 外层筛选出时间差≥30分钟的记录,同时保留第一条数据(因为它没有上一条记录,
diff_minutes会是NULL)
场景2:按固定30分钟时间点取对应数据
如果你想要的是每个整点/半点(比如00:00、00:30、01:00...)取最近的一条数据,可以用窗口函数ROW_NUMBER()来实现:
SELECT record_time, -- 替换成你需要的其他字段 value FROM ( SELECT *, ROW_NUMBER() OVER ( -- 把每条记录分到对应的30分钟窗口(比如00:00-00:29归到00:00,00:30-00:59归到00:30) PARTITION BY DATE_FORMAT(record_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(record_time)/30)*30 MINUTE -- 按离窗口时间点的远近排序,最近的排第1 ORDER BY ABS(TIMESTAMPDIFF(SECOND, record_time, DATE_FORMAT(record_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(record_time)/30)*30 MINUTE)) ) AS rn FROM your_table -- 替换成你的表名 ) t -- 取每个窗口里的第一条(最近的那条数据) WHERE rn = 1;
逻辑说明:
PARTITION BY后面的逻辑:把每条记录映射到对应的30分钟窗口起始时间ROW_NUMBER()在每个窗口内,按记录时间离窗口起始时间的远近排序,最近的标记为1- 外层筛选出每个窗口的第一条数据,就得到了固定30分钟间隔的结果
内容的提问来源于stack exchange,提问作者songzeyang
相关产品推荐
相关产品推荐

