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

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;

逻辑说明:

  1. LAG(record_time) OVER (ORDER BY record_time):按时间排序后,获取当前记录的上一条记录的时间
  2. TIMESTAMPDIFF:计算两条记录的时间差(单位为分钟)
  3. 外层筛选出时间差≥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;

逻辑说明:

  1. PARTITION BY后面的逻辑:把每条记录映射到对应的30分钟窗口起始时间
  2. ROW_NUMBER()在每个窗口内,按记录时间离窗口起始时间的远近排序,最近的标记为1
  3. 外层筛选出每个窗口的第一条数据,就得到了固定30分钟间隔的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:03:36