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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:42:16