mysql - 我如何用 +1 shift 对两行进行减法来创建一个新列

标签 mysql sql subtraction shift

我有两列

sum1   sum2
100    70
60     20
30     10

我还需要一列 col3 可以像这样通过减法计算

sum1    sum2    col3
100     70      null
60      20      -80
30      10      -50 

-80 我可以通过 20-100-50 通过 10-60。我需要用一个 shift 减去 raws

如何通过 sql 查询获取这个新列?

最佳答案

在关系数据库中,记录默认是无序的,因此不存在前置记录的内在概念。为了使您的请求成为可能,您确实需要原始表中的一列可用于排序记录。我假设这样的列存在于表中并称为 id

如果您运行的是 MySQL 8.0,则使用窗口函数 LAG() 很简单,它可以让您访问之前的记录:

SELECT sum1, sum2, sum2 - LAG(sum1) OVER(ORDER BY id) col3
FROM mytable

如果您运行的是较旧的 MySQL 版本,那么它会稍微复杂一些。一个常见的解决方案是自连接表,并使用 NOT EXISTS 条件来定位前一条记录(这句话如:recover the record has a smaller id than the current record, and for which不存在 ID 小于当前记录且大于加入记录的其他记录):

SELECT t.sum1, t.sum2, t.sum2 - t_last.sum1 col3
FROM mytable t
LEFT JOIN mytable t_last
    ON t_last.id < t.id
    AND NOT EXISTS (
        SELECT 1 
        FROM mytable t1
        WHERE t1.id < t.id AND t1.id > t_last.id
    )

关于mysql - 我如何用 +1 shift 对两行进行减法来创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57907640/

相关文章:

php - 如何减少使用PHP和MySQL对海量数据执行某些操作所需的时间?

php - SQL 查询将逗号分隔的字符串与逗号分隔的字符串进行匹配?

sql - 需要修剪oracle中的空格

python - 仅从数组中的大元素中减去 10000

mysql - 我可以让三个数据库的三个mySQL三个字段一起交互吗?

sql - MySQL:错误 1628:表 'customer' 的注释太长(最大值 = 60)

mysql - mysql 中 SELECT 语句的 WHERE 子句中的 CONCAT

sql - 结果SQL结果从Grails Controller 到下拉列表框

math - 为什么二进制减法总是(?)通过添加补码来完成?

javascript - Nodejs 减号失败