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
相关产品推荐
相关产品推荐

