MySQL/MariaDB中当前日期虚拟记录与预测记录去重方案咨询
上下文
我有一张图表,展示基于已发生记录和预测记录的两组累计值时间序列。
同一日期可能有多条记录,它们的值会被汇总到daily_value列中。
预测累计值的时间序列会延续已记录的时间序列至当前时间。
需求
为了保证“历史”与“预测”时间序列之间的图形连续性,需要为当前日期(如下例中的2025-03-18)生成一条虚拟记录,其daily_value为0,不会改变累计值。
{"serie":"2025 measured","date":"2025-03-17","daily_value":"100","cumulative":"1200"}, {"serie":"2025 measured","date":"2025-03-18","daily_value":"50","cumulative":"1250"}, {"serie":"2025 forecast","date":"2025-03-18","daily_value":"0","cumulative":"1250"}, {"serie":"2025 forecast","date":"2025-03-18","daily_value":"100","cumulative":"1350"}, {"serie":"2025 forecast","date":"2025-03-31","daily_value":"500","cumulative":"1850"},
该方案仅在当前日期无已存在的预测记录时有效。
问题:同一日期的虚拟记录与预测记录冲突
如果当前日期已存在预测记录,绘图库(dimplejs)会将两条记录(虚拟和预测)的值相加,表现得像直方图一样,而非仅绘制后者。这是由dimplejs的设计及我的使用方式导致的。
基于上述示例数据,2025-03-18当天,预测时间序列使用的值为2600(即1250 + 1350),而非预期的1350。这会导致“跳变”,使预测值序列无法与已记录值序列衔接。
(图示:已记录和待生成的累计值序列出现跳变)
生成序列的查询语句
以下是用于提取记录的MySQL/MariaDB查询语句。
第一个UNION之前的代码部分提取已记录值。
第二个UNION之前的SELECT语句生成虚拟记录。
第二个UNION之后的代码提取预测值。
SELECT d.serie,d.date,daily_value, @summed_values_2025:= (@summed_values_2025 + d.daily_value) AS cumulative FROM (SELECT CONCAT(YEAR(date),' measured') AS serie, DATE(date) AS date, SUM(measurement) AS daily_value FROM measurements_2025 GROUP BY date) d JOIN (SELECT @summed_values_2025:=0) c UNION SELECT d.serie,d.date,daily_value, @summed_values_2025 + (@summed_values_forecast:= @summed_values_forecast +d.daily_value) AS cumulative FROM ( SELECT CONCAT(YEAR(CURDATE()),' forecast') AS serie, CURDATE() AS date, 0 AS daily_value UNION SELECT CONCAT(YEAR(date),' forecast') AS serie, DATE(date) AS date, SUM(value) AS daily_value FROM forecasts_2025 WHERE date >= CURDATE() GROUP BY date ) d JOIN (SELECT @summed_values_forecast:=0) c ORDER BY year ASC, date ASC
(注:原SQL存在语法错误,已修正括号位置)
咨询
是否有优雅的方式对当前日期的虚拟记录与预测记录进行去重?可选思路如下:
- 是否应将虚拟记录移至末尾,并在第一个
UNION后对date列使用SELECT DISTINCT? - 是否有其他方式修改SQL查询以实现“内联”去重?
- 或者在结果后处理中,若当前日期已有预测值则删除虚拟记录会更好?
内容的提问来源于stack exchange,提问作者OuzoPower
相关产品推荐
相关产品推荐

