提问人:Volodymyr 提问时间:9/12/2019 最后编辑:GMBVolodymyr 更新时间:9/12/2019 访问量:166
我如何用 +1 移位为两个原始值做一个减法的新列
How I can make a new column with subtraction for two raws with +1 shift
问:
我有两列
sum1 sum2
100 70
60 20
30 10
我还需要一列,可以像这样通过减法来计算col3
sum1 sum2 col3
100 70 null
60 20 -80
30 10 -50
-80
我可以过得去.我需要用 shift 对原始值进行减法20-100
-50
10-60
如何通过sql查询获取此新列?
答:
0赞
GMB
9/12/2019
#1
在关系数据库中,默认情况下记录是无序的,因此没有预处理记录的固有概念。为了实现您的要求,您确实需要原始表中的一列,该列可用于对记录进行排序。我假设表中存在这样的列,称为 .id
如果您运行的是MySQL 8.0,则使用窗口函数可以直接访问上一条记录:LAG()
SELECT sum1, sum2, sum2 - LAG(sum1) OVER(ORDER BY id) col3
FROM mytable
如果您运行的是较旧的MySQL版本,则情况会稍微复杂一些。一个常见的解决方案是自联接表,并使用条件来查找上一条记录(以下短语为:恢复记录的 ID 小于当前记录,并且不存在 ID 小于当前记录且大于联接记录的其他记录):NOT EXISTS
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
)
0赞
chinmay gandi
9/12/2019
#2
创建一个接受 2 个 int 参数的过程。在里面写减法语句。现在,由于我们不能在 select 语句中调用此过程,我们将创建一个包装类函数,该函数将调用该过程,然后通过 select 语句调用此函数并插入到第 3 列中。我们不能直接调用函数/过程,因为我们在调用函数时无法在 select 语句中执行 DML 操作
评论
SELECT version();
id