You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 内层子查询:
    • 用TIMESTAMP(fecha, hora)拼接日期和时间,得到完整的时间戳
    • 计算该时间戳与当日8点时间戳的分钟差,作为排序依据
    • 按fecha分组,用ROW_NUMBER()为每组记录按时间差升序编号,最接近8点的记录编号为1
  2. 外层查询:只保留每组编号为1的记录,即每日目标数据

内容的提问来源于stack exchange,提问作者CVB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:35:28