MySQL查询每日最接近早8点的首条数据问题求助
解决方案:获取每日最接近早8点的首条数据
要实现每日取不早于8点且最接近8点的第一条数据,核心思路是按日期分组,计算每条记录与当日8点的时间差,再为每组记录按时间差排序,取排名第一的结果。以下是具体实现:
基础查询语句(适配你的表结构)
假设fecha是日期类型、hora是时间类型,使用窗口函数ROW_NUMBER()来分组排序:
SELECT id_estacion, fecha, hora, valor FROM ( SELECT id_estacion, fecha, hora, valor, -- 按日期分组,按与8点的时间差升序排名 ROW_NUMBER() OVER ( PARTITION BY fecha ORDER BY TIMESTAMPDIFF(MINUTE, TIMESTAMP(fecha, '08:00:00'), TIMESTAMP(fecha, hora)) ASC ) AS rn FROM datos WHERE id_estacion = 1 AND tipo_sensor = 3 -- 只保留8点及之后的数据 AND TIMESTAMP(fecha, hora) >= TIMESTAMP(fecha, '08:00:00') ) AS ranked_data WHERE rn = 1;
适配期望的日期格式
如果需要将日期格式转为dd/mm/yyyy(如你的示例结果),可以用DATE_FORMAT()函数修改输出字段:
SELECT id_estacion, DATE_FORMAT(fecha, '%d/%m/%Y') AS fecha, hora, valor FROM ( SELECT id_estacion, fecha, hora, valor, ROW_NUMBER() OVER ( PARTITION BY fecha ORDER BY TIMESTAMPDIFF(MINUTE, TIMESTAMP(fecha, '08:00:00'), TIMESTAMP(fecha, hora)) ASC ) AS rn FROM datos WHERE id_estacion = 1 AND tipo_sensor = 3 AND TIMESTAMP(fecha, hora) >= TIMESTAMP(fecha, '08:00:00') ) AS ranked_data WHERE rn = 1;
逻辑说明
- 内层子查询:
- 用
TIMESTAMP(fecha, hora)拼接日期和时间,得到完整的时间戳 - 计算该时间戳与当日8点时间戳的分钟差,作为排序依据
- 按
fecha分组,用ROW_NUMBER()为每组记录按时间差升序编号,最接近8点的记录编号为1
- 用
- 外层查询:只保留每组编号为1的记录,即每日目标数据
内容的提问来源于stack exchange,提问作者CVB
相关产品推荐
相关产品推荐

