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

MySQL是否支持downsampling/upsampling查询?时间序列数据降采样需求

MySQL时间序列下采样解决方案

1. MySQL是否有专门的下采样/上采样函数?

MySQL没有提供专门用于**downsampling(下采样)或upsampling(上采样)**的内置函数,但可以通过日期时间处理函数(如DATE()、HOUR()、MINUTE()等)结合GROUP BY分组语法,实现时间序列数据的采样需求。上采样则通常需要生成时间序列后关联原数据补全,同样依赖日期函数和表连接实现。

2. 按天分组的每小时采样查询方案

你的需求是在指定时间范围内,按天分组获取每小时一条的时间序列数据,原查询的问题在于仅按HOUR()分组,未区分日期,导致不同天的同一小时数据被合并,且结果未正确排序。

修正后的查询语句

以下语句将筛选指定时间范围的数据,按日期+小时分组,取每个小时内的最后一条记录(和你当前输出的时间特征匹配),并按时间顺序排序:

SELECT MAX(signaldate) AS sampled_datetime
FROM mydatabase
WHERE signaldate BETWEEN '2018-01-16 16:01:00' AND '2019-01-16 16:01:00'
GROUP BY DATE(signaldate), HOUR(signaldate)
ORDER BY sampled_datetime;

如果需要取每个小时的第一条记录,只需将MAX(signaldate)替换为MIN(signaldate)即可。

关于按天分隔输出的说明

SQL本身不支持直接在结果集中插入空行来分隔不同日期的数据,这种格式处理更适合在应用代码中实现:遍历查询结果时,当日期发生变化,插入空行即可。

若一定要在SQL中实现(不推荐,仅作演示),可以通过变量标记日期变化,输出空行:

SELECT 
    sampled_datetime,
    IF(@prev_date != DATE(sampled_datetime), '\n', '') AS date_separator
FROM (
    SELECT MAX(signaldate) AS sampled_datetime
    FROM mydatabase
    WHERE signaldate BETWEEN '2018-01-16 16:01:00' AND '2019-01-16 16:01:00'
    GROUP BY DATE(signaldate), HOUR(signaldate)
    ORDER BY sampled_datetime
) t, (SELECT @prev_date := NULL) init
ORDER BY sampled_datetime;

注意这种方式会生成额外的分隔符列,实际使用中仍建议在应用层处理格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47