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

按月份和site_id计算energy最值差的SQL查询问题求助

问题分析与修正SQL

原SQL语句的核心问题是缺少分组逻辑,没有按「月份」和「site_id」对数据进行分组,导致所有符合条件的记录被合并成一行计算,无法得到每个分组的单独差值。

修正后的SQL语句(匹配需求中的「每个月份、每个site_id」维度)

SELECT
    ROW_NUMBER() OVER(ORDER BY DATE_FORMAT(t2.timeIn, '%Y-%m'), t1.site_id) AS id,
    MAX(t2.timeIn) AS timeIn,
    MAX(t2.energy) - MIN(t2.energy) AS result_energy
FROM Electric.site_map_pae AS t1
INNER JOIN Electric.electric AS t2
    ON t1.site_id = t2.site_id
WHERE
    t1.off_id = '3'
    AND t2.timeIn BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59'
GROUP BY
    DATE_FORMAT(t2.timeIn, '%Y-%m'), -- 提取年月作为月份分组依据
    t1.site_id
ORDER BY
    DATE_FORMAT(t2.timeIn, '%Y-%m'),
    t1.site_id;

关键改动说明

  1. 添加分组逻辑:通过GROUP BY DATE_FORMAT(t2.timeIn, '%Y-%m'), t1.site_id,确保按「年月」和「site_id」分别计算差值,完全匹配需求中“每个月份、每个site_id”的统计要求。
  2. 生成自增id:使用ROW_NUMBER()函数生成结果表的自增id,对齐期望结果的格式。
  3. 简化聚合计算:去掉不必要的DISTINCT,直接用MAX(energy)-MIN(energy)计算差值——同一分组内的极值计算无需去重,避免逻辑冗余。

结果说明

执行修正后的SQL会得到如下结果(符合分组逻辑的统计结果):

idtimeInresult_energy
12022-07-09 18:37:2310
22022-07-07 10:46:230
32022-08-09 13:37:2330
42022-08-06 20:46:2310

如果你的期望结果仅需要按月份汇总(忽略site_id维度),可以调整分组逻辑为仅按年月分组:

SELECT
    ROW_NUMBER() OVER(ORDER BY DATE_FORMAT(t2.timeIn, '%Y-%m')) AS id,
    MAX(t2.timeIn) AS timeIn,
    MAX(t2.energy) - MIN(t2.energy) AS result_energy
FROM Electric.site_map_pae AS t1
INNER JOIN Electric.electric AS t2
    ON t1.site_id = t2.site_id
WHERE
    t1.off_id = '3'
    AND t2.timeIn BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59'
GROUP BY
    DATE_FORMAT(t2.timeIn, '%Y-%m')
ORDER BY
    DATE_FORMAT(t2.timeIn, '%Y-%m');

该语句返回结果:

idtimeInresult_energy
12022-07-09 18:37:2310
22022-08-09 13:37:2330

注:若期望结果中的40对应特定业务逻辑(如跨月份累计差值),需补充相关规则说明以进一步调整SQL。

内容的提问来源于stack exchange,提问作者Pae Panutat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:54:21