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

如何将站点用电数据与约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;

关键部分说明

  1. 指定年月筛选:通过YEAR()和MONTH()函数精准定位目标时间段的记录。
  2. 匹配近似上月记录:子查询中用TIMESTAMPADD(MONTH, -1, curr.DATE_RECORD)计算当前记录的「上月对应日期」,再通过ABS(DATEDIFF(...))计算日期差的绝对值,排序后取最接近的一条。
  3. 百分比计算:用CASE语句处理历史消耗为0的情况(避免除以0报错),ROUND()保留两位小数让结果更直观。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:33:22