如何将站点用电数据与约1个月前同站点数据对比并计算差值百分比
解决FL_ENGIE_ELEC表的电力消耗同比百分比计算问题
核心逻辑
针对指定年月的站点记录,为每个站点匹配**时间最接近「当前记录日期减1个月」**的历史消耗数据,再计算两者的差值百分比。
完整SQL语句
SELECT curr.SITE_ID, curr.DATE_RECORD AS 当前记录日期, curr.CONSOMMATION_TOTALE__KWH_ AS 当前消耗_KWH, hist.CONSOMMATION_TOTALE__KWH_ AS 上月近似消耗_KWH, -- 计算差值百分比,处理除数为0的情况 CASE WHEN hist.CONSOMMATION_TOTALE__KWH_ = 0 THEN NULL ELSE ROUND(((curr.CONSOMMATION_TOTALE__KWH_ - hist.CONSOMMATION_TOTALE__KWH_) / hist.CONSOMMATION_TOTALE__KWH_) * 100, 2) END AS 消耗差值百分比 FROM FL_ENGIE_ELEC curr LEFT JOIN FL_ENGIE_ELEC hist ON curr.SITE_ID = hist.SITE_ID AND hist.DATE_RECORD = ( -- 子查询:找到当前站点最接近「当前日期减1个月」的历史记录 SELECT DATE_RECORD FROM FL_ENGIE_ELEC WHERE SITE_ID = curr.SITE_ID AND DATE_RECORD <= TIMESTAMPADD(MONTH, -1, curr.DATE_RECORD) ORDER BY ABS(DATEDIFF(DATE_RECORD, TIMESTAMPADD(MONTH, -1, curr.DATE_RECORD))) ASC LIMIT 1 ) -- 筛选指定年月的记录 WHERE YEAR(curr.DATE_RECORD) = '2018' AND MONTH(curr.DATE_RECORD) = '02' ORDER BY curr.SITE_ID, curr.DATE_RECORD;
关键部分说明
- 指定年月筛选:通过
YEAR()和MONTH()函数精准定位目标时间段的记录。 - 匹配近似上月记录:子查询中用
TIMESTAMPADD(MONTH, -1, curr.DATE_RECORD)计算当前记录的「上月对应日期」,再通过ABS(DATEDIFF(...))计算日期差的绝对值,排序后取最接近的一条。 - 百分比计算:用
CASE语句处理历史消耗为0的情况(避免除以0报错),ROUND()保留两位小数让结果更直观。 - LEFT JOIN:确保即使某个站点没有上月近似记录,当前记录也会被保留(对应百分比为NULL)。
注意事项
- 请根据实际表结构调整字段名:比如
SITE_ID是站点唯一标识,DATE_RECORD是记录时间字段,若你的字段名不同,需替换成实际名称。 - 不同数据库的日期函数可能有差异:比如SQL Server用
DATEADD(MONTH, -1, curr.DATE_RECORD),Oracle用ADD_MONTHS(curr.DATE_RECORD, -1),需根据使用的数据库调整。
内容的提问来源于stack exchange,提问作者Chipniz
相关产品推荐
相关产品推荐

