SQL中如何计算两个非连续数据行之间的差值

SQL实现方案
你的需求是固定取排序后的第一行作为基准值,逐行计算基准值和后续每一行的差值,不需要逐行错位关联,用以下方法即可实现:
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle 等)
直接用first_value()窗口函数取排序后的首个基准值,和当前行数值做差即可,写法最简单性能也最好:
SELECT 排序列, 原数值列, -- 按指定排序规则取第一行的数值作为基准,和当前行做差 first_value(原数值列) OVER (ORDER BY 排序列) - 原数值列 AS 第三列差值 FROM 你的业务表;
如果需要按维度分组计算(比如每个分类单独取组内第一行做差),只需要在窗口函数中增加分区规则:
SELECT 分组列, 排序列, 原数值列, first_value(原数值列) OVER (PARTITION BY 分组列 ORDER BY 排序列) - 原数值列 AS 第三列差值 FROM 你的业务表;
差值的正负方向可以根据需求调整两个字段的顺序,如果需要当前行值减第一行基准值,交换两个计算字段的位置即可。
不支持窗口函数的低版本场景(如MySQL 5.x)
可以先通过子查询查出排序第一的基准值,再和原表关联计算:
SELECT t1.排序列, t1.原数值列, t2.base_val - t1.原数值列 AS 第三列差值 FROM 你的业务表 t1, (SELECT 原数值列 base_val FROM 你的业务表 ORDER BY 排序列 LIMIT 1) t2;
如果是分组计算场景,给子查询增加分组关联条件,取每个分组下的首行基准值即可。
内容的提问来源于stack exchange,提问作者Harshith S H
相关产品推荐
相关产品推荐

