SQL Server 计算相邻行Record_Count字段百分比差值与方差咨询
实现方案
你可以用SQL Server内置的LAG()窗口函数快速实现相邻行的数值对比,这是最简洁高效的实现方式,兼容SQL Server 2012及以上版本。
完整查询代码
WITH PreData AS ( SELECT ID, Record_Count, -- 按ID升序取上一行的Record_Count值 LAG(Record_Count, 1) OVER(ORDER BY ID ASC) AS Last_Record_Count FROM 你的实际表名 -- 替换为你自己的表名 ) SELECT ID, Record_Count, -- 计算百分比差值,处理空值和除零异常 CASE WHEN Last_Record_Count IS NULL THEN NULL WHEN Last_Record_Count = 0 THEN NULL ELSE ROUND(CAST((Record_Count - Last_Record_Count) AS FLOAT) / Last_Record_Count * 100, 2) END AS Variance FROM PreData ORDER BY ID ASC;
示例数据运行结果
代入你给出的测试数据,查询结果如下:
| ID | Record_Count | Variance |
|---|---|---|
| 267 | 28464 | NULL |
| 268 | 548 | -98.07 |
| 269 | 28361 | 5075.36 |
| 270 | 543 | -98.09 |
低版本兼容方案
如果你使用的是SQL Server 2012之前的版本,可以用自连接实现相同逻辑:
SELECT t1.ID, t1.Record_Count, CASE WHEN t2.Record_Count IS NULL THEN NULL WHEN t2.Record_Count = 0 THEN NULL ELSE ROUND(CAST((t1.Record_Count - t2.Record_Count) AS FLOAT) / t2.Record_Count * 100, 2) END AS Variance FROM 你的实际表名 t1 LEFT JOIN 你的实际表名 t2 ON t1.ID = t2.ID + 1 ORDER BY t1.ID ASC;
注意事项
- 如果你的行排序逻辑不是按ID升序,只需要修改
OVER()子句里的ORDER BY字段即可,比如按业务日期字段排序。 - 你可以调整
ROUND()函数的第二个参数修改百分比保留的小数位数,不需要保留小数可以直接去掉ROUND函数。
内容的提问来源于stack exchange,提问作者Beanymattd
相关产品推荐
相关产品推荐

