当前位置: 首页 > 面试题库 >

在SQL中计算增量(当前行与上一行的差)

蒯华彩
2023-03-14
问题内容

我有一个像这样的表:例如,trans是表的名称

Id | Trans_Date          | Account_Id | Amount | Delta
------------------------------------------------------
1  | 2011-02-20 00:00:00 |     2      | 1200   | NULL
------------------------------------------------------
2  | 2011-03-21 00:00:00 |     2      | 2000   | NULL
------------------------------------------------------
3  | 2011-04-22 00:00:00 |     2      | 4500   | NULL
------------------------------------------------------
4  | 2011-02-20 00:00:00 |     4      | 1000   | NULL
------------------------------------------------------
5  | 2011-03-21 00:00:00 |     4      | 2400   | NULL
------------------------------------------------------
6  | 2011-04-22 00:00:00 |     4      | 3000   | NULL
------------------------------------------------------

而且我必须更新Delta列。假设每月有一笔交易,则该值是同一帐户的当前行与同一帐户的先前行之差。这是一个可以生成增量值的虚拟sql

select tt1.id, tt1.amount , tt1.AccountId,(tt1.amount-tt2.amount) as delta 
from trans tt1 left outer  JOIN trans  tt2 
on tt1.accountid = tt2.accountid
where month(tt1.date1)-month(tt2.date1)=1 ;

该查询的结果是

id | amount | AccountId  | delta  |
-------------------------------------
2  | 2000   |     2      | 800    | 
-------------------------------------
3  | 4500   |     2      | 2500   |
-------------------------------------
5  | 2400   |     4      | 1400   | 
-------------------------------------
6  | 3000   |     4      | 600    | 
-------------------------------------

但是没有任何前一行的行的增量应该是其数量,例如

1  | 1200   |     2      | 1200   | 
-----------------------------------------
4  | 1000   |     4      | 1000   | 
-----------------------------------------

这些都是顺便说了。

请帮助我解决此查询。


问题答案:

这是您对原始查询进行的相应修改:

select
  tt1.id,
  tt1.amount,
  tt1.AccountId,
  (tt1.amount-ifnull(tt2.amount, 0)) as delta
from trans tt1
  left outer JOIN trans tt2 on tt1.accountid = tt2.accountid
    and month(tt1.date1)-month(tt2.date1)=1;

月比较从移动whereon,这使得一个差left join,并且tt2.amount被替换为ifnull(tt2.amount, 0)

UPDATE 脚本 的版本:

update tt1
set delta = (tt1.amount-ifnull(tt2.amount, 0))
from trans tt1
  left outer JOIN trans tt2 on tt1.accountid = tt2.accountid
    and month(tt1.date1)-month(tt2.date1)=1;

上述更新的正确MySQL语法实际上应为:

update trans tt1 
             left outer JOIN trans tt2 
             on tt1.accountid = tt2.accountid 
             and month(tt1.date1)-month(tt2.date1)=1 
set tt1.delta = (tt1.amount-ifnull(tt2.amount, 0));

(感谢 @pinkb 。)



 类似资料:
  • 问题内容: 我有一个名为team的表,如下所示:我只是在第三列中添加了row_number 当16出现时,则以1开头,而16依次出现,则一一加。结果就像 帮我得到结果。 问题答案: 您可以使用以下查询: 字段标识具有相同值的连续记录的切片(也称为孤岛)。外部查询用于枚举属于切片的每个记录。属于其他切片的记录被分配了值。 演示在这里

  • 问题内容: 说我有身份证。我将如何获得下一行或上一行? 问题答案: 这就是我用来查找上一个/下一个记录的方法。表格中的任何列都可以用作排序列,并且不需要联接或讨厌的技巧: 下一条记录(日期大于当前记录): 上一个记录(日期小于当前记录): 例:

  • 我有一列填写了ISO格式的日期(带有标题行),例如: 我想数一下与当月匹配的行数。 是否可以使用Google电子表格中的功能来实现此结果? 没有ISO日期的相同问题可以在以下位置找到: 计算当前月份的行数

  • 问题内容: 我有一个看起来像这样的表: 并且我想计算出上一日期的column的增加/减少百分比。例如,结果将是这样的, 我已经搜寻并绞尽脑汁了几天。通常,我只是使用服务器端代码来完成此操作,但是现在我需要将其全部包含在查询中。 问题答案: 试试这个:

  • 问题内容: 想象一下下表(称为): 我想要一个按日期顺序返回运行总计的查询,例如: 我知道在SQL Server 2000/2005/2008中可以通过多种方式进行此操作。 我对使用aggregating-set-statement技巧的这种方法特别感兴趣: …这是非常有效的,但是我听说周围存在一些问题,因为您不一定能保证该语句将以正确的顺序处理行。也许我们可以获得有关该问题的明确答案。 但是,人

  • 我有一行填充了日期,格式为MM / dd / yyyy(带有标题行),例如: 我想计算与当前月份匹配的行数 这是否可以使用函数实现此结果?最好使用谷歌电子表格,但Excel也很好。