如何合并MySQL查询获取同一列不同时段的SoC数据用于绘图?
合并MySQL查询获取每日两个时段的电池SoC数据
需要从luxpower表中提取每日约2点(午夜后≤120分钟)和7点(午夜后≤420分钟)的电池State of Charge(SoC)数据,合并成包含socama(2点时段)、socamb(7点时段)的单一结果集。
注意:原查询的潜在问题
你之前的两个查询直接用GROUP BY Date_MySQL但未指定聚合逻辑,同一日期可能有多条符合条件的记录,会导致返回的SoC值不确定。建议取每个时段内最接近目标时间的记录(即该时段内Minutes_Since_Midnight最大的那条),这样数据更准确。
方案一:条件聚合(简洁高效)
用CASE语句筛选对应时段的SoC,配合聚合函数取该时段的最新数据:
SELECT Date_MySQL, -- 取每日0-2点内的最后一条SoC(最接近2点) MAX(CASE WHEN Minutes_Since_Midnight <= 120 THEN soc END) AS socama, -- 取每日0-7点内的最后一条SoC(最接近7点) MAX(CASE WHEN Minutes_Since_Midnight <= 420 THEN soc END) AS socamb FROM luxpower GROUP BY Date_MySQL ORDER BY Date_MySQL;
如果某日期没有对应时段的数据,对应字段会返回NULL,适合需要保留所有日期的场景。
方案二:自连接获取精准时段数据
通过子查询分别获取两个时段的最新记录,再按日期关联:
SELECT t1.Date_MySQL, t1.soc AS socama, t2.soc AS socamb FROM -- 获取每日0-2点内最接近2点的SoC记录 (SELECT Date_MySQL, soc FROM luxpower l1 WHERE Minutes_Since_Midnight = (SELECT MAX(Minutes_Since_Midnight) FROM luxpower l2 WHERE l2.Date_MySQL = l1.Date_MySQL AND l2.Minutes_Since_Midnight <= 120)) t1 -- 用LEFT JOIN保留所有日期,即使7点时段无数据;用INNER JOIN则只保留两个时段都有数据的日期 LEFT JOIN -- 获取每日0-7点内最接近7点的SoC记录 (SELECT Date_MySQL, soc FROM luxpower l3 WHERE Minutes_Since_Midnight = (SELECT MAX(Minutes_Since_Midnight) FROM luxpower l4 WHERE l4.Date_MySQL = l3.Date_MySQL AND l4.Minutes_Since_Midnight <= 420)) t2 ON t1.Date_MySQL = t2.Date_MySQL ORDER BY t1.Date_MySQL;
内容的提问来源于stack exchange,提问作者Peter_Brown_USA
相关产品推荐
相关产品推荐

