如何在SQL中计算当前行energy字段与下一行同字段值的差值
问题分析
你当前的写法存在两个核心问题:
- 子查询取
top 1没有加排序逻辑,无法保证每次都能取到和当前行紧接的下一条记录,且关联子查询在数据量大时执行效率极低 - 语句中的
GROUP BY属于冗余逻辑,你没有聚合计算需求,不需要分组
优化方案
直接用SQL Server内置的LEAD窗口函数即可实现取同日期下下一行数值的需求,逻辑更清晰执行效率更高。如果你的预期结果差值是原计算结果的1/10,额外加除法逻辑即可,最终语句如下:
SELECT datapm.id, datapm.tgl, CONVERT(CHAR(5), datapm.stamp, 108) stamp, datapm.pmid, datapm.vavg, datapm.pf, (CAST(datapm.energy AS FLOAT) - LEAD(CAST(energy AS FLOAT)) OVER (PARTITION BY tgl ORDER BY id)) / 10 AS energy FROM datapm ORDER BY tgl DESC, id ASC
逻辑说明
LEAD(CAST(energy AS FLOAT)) OVER (PARTITION BY tgl ORDER BY id)会自动按tgl分组,同分组内按id升序排序,取当前行的下一行energy值- 如果最后一行不需要返回数值,保持当前写法即可,最后一行差值会返回
NULL;如果需要自定义默认值,可以给LEAD函数传第二个和第三个参数,例如LEAD(CAST(energy AS FLOAT), 1, 0)代表找不到下一行时默认用0参与计算
内容的提问来源于stack exchange,提问作者Ahmad Andreansyah
相关产品推荐
相关产品推荐

