按月份和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;
关键改动说明
- 添加分组逻辑:通过
GROUP BY DATE_FORMAT(t2.timeIn, '%Y-%m'), t1.site_id,确保按「年月」和「site_id」分别计算差值,完全匹配需求中“每个月份、每个site_id”的统计要求。 - 生成自增id:使用
ROW_NUMBER()函数生成结果表的自增id,对齐期望结果的格式。 - 简化聚合计算:去掉不必要的
DISTINCT,直接用MAX(energy)-MIN(energy)计算差值——同一分组内的极值计算无需去重,避免逻辑冗余。
结果说明
执行修正后的SQL会得到如下结果(符合分组逻辑的统计结果):
| id | timeIn | result_energy |
|---|---|---|
| 1 | 2022-07-09 18:37:23 | 10 |
| 2 | 2022-07-07 10:46:23 | 0 |
| 3 | 2022-08-09 13:37:23 | 30 |
| 4 | 2022-08-06 20:46:23 | 10 |
如果你的期望结果仅需要按月份汇总(忽略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');
该语句返回结果:
| id | timeIn | result_energy |
|---|---|---|
| 1 | 2022-07-09 18:37:23 | 10 |
| 2 | 2022-08-09 13:37:23 | 30 |
注:若期望结果中的40对应特定业务逻辑(如跨月份累计差值),需补充相关规则说明以进一步调整SQL。
内容的提问来源于stack exchange,提问作者Pae Panutat
相关产品推荐
相关产品推荐

