我有下表:
+---------+--------+----------+------+-------+--------+-----------+
| 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)进行。
我想要的结果是:
+---------+--------+----------+------+-------+--------+--------------------------------+
| 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) |
+---------+--------+----------+------+-------+--------+--------------------------------+发布于 2021-02-13 12:32:58
SQL表表示无序集。除非列指定排序,否则不存在“前一”行。在你的数据中,这意味着xYear和xMonth --甚至认为结果不遵循这个规则。
假设您想要一个时间顺序(或基于任何列的排序),那么您可以使用累积和窗口函数:
select t.*,
sum(xRaseed) over (partition by xAccID order by xYear, xMonth) as running_xRaseed
from t;这里是db<>fiddle。
发布于 2021-02-13 12:32:05
在MySQL 8+中,它有点像这样:
SUM(xRaseed) OVER(PARTITION BY xAccId ORDER BY xYear DESC, xMonth DESC) 不过,我要指出的是,您的“前一行”概念已被打破。在一组中,日期增加,而在另一组,日期减少。如果应该是这样的话,比如“对于xCat = 'Rs,日期增加了,但对于Cus,日期减少了”,那么一些小提琴就像:
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
)https://stackoverflow.com/questions/66185087
复制相似问题