首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将行中的当前列值与前一个值相加?

问如何将行中的当前列值与前一个值相加?
EN

Stack Overflow用户
提问于 2021-02-13 12:28:17
回答 2查看 208关注 0票数 1

我有下表:

代码语言:javascript
复制
+---------+--------+----------+------+-------+--------+-----------+
| xType   | xAccID | xAccName | xCat | xYear | xMonth | xRaseed   |
+---------+--------+----------+------+-------+--------+-----------+
| Amounts | 52     | Acc1     | Rs   | 2020  | 11     | 3144.83   |
| Amounts | 52     | Acc1     | Rs   | 2020  | 12     | -15199.64 |
| Amounts | 53     | Acc2     | Cus  | 2020  | 12     | 5306.04   |
| Amounts | 53     | Acc2     | Cus  | 2020  | 11     | 1090.64   |
+---------+--------+----------+------+-------+--------+-----------+

实际上,我希望将当前行中的(xRaseed)与上一行中的(xRaseed)相加,分别对每个(xAccID)进行。

我想要的结果是:

代码语言:javascript
复制
+---------+--------+----------+------+-------+--------+--------------------------------+
| xType   | xAccID | xAccName | xCat | xYear | xMonth | xRaseed                        |
+---------+--------+----------+------+-------+--------+--------------------------------+
| Amounts | 52     | Acc1     | Rs   | 2020  | 11     | 3144.83                        | 
| Amounts | 52     | Acc1     | Rs   | 2020  | 12     | Not -15199.64 But (-12,054.81) |
| Amounts | 53     | Acc2     | Cus  | 2020  | 12     | 5306.04                        |
| Amounts | 53     | Acc2     | Cus  | 2020  | 11     | Not 1090.64 But (6,396.68)     |
+---------+--------+----------+------+-------+--------+--------------------------------+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-13 12:32:58

SQL表表示无序集。除非列指定排序,否则不存在“前一”行。在你的数据中,这意味着xYear和xMonth --甚至认为结果不遵循这个规则。

假设您想要一个时间顺序(或基于任何列的排序),那么您可以使用累积和窗口函数:

代码语言:javascript
复制
select t.*,
       sum(xRaseed) over (partition by xAccID order by xYear, xMonth) as running_xRaseed
from t;

这里是db<>fiddle。

票数 0
EN

Stack Overflow用户

发布于 2021-02-13 12:32:05

在MySQL 8+中,它有点像这样:

代码语言:javascript
复制
SUM(xRaseed) OVER(PARTITION BY xAccId ORDER BY xYear DESC, xMonth DESC)  

不过,我要指出的是,您的“前一行”概念已被打破。在一组中,日期增加,而在另一组,日期减少。如果应该是这样的话,比如“对于xCat = 'Rs,日期增加了,但对于Cus,日期减少了”,那么一些小提琴就像:

代码语言:javascript
复制
SUM(xRaseed) OVER(
  PARTITION BY xAccId 
  ORDER BY 
    xYear * CASE WHEN xCat = 'Rs' THEN 1 ELSE -1 END, 
    xMonth * CASE WHEN xCat = 'Rs' THEN 1 ELSE -1 END
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66185087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档