我有一张wallet英镑的桌子,是这样的:

// wallet
+----+----------+--------+
| id | user_id  | amount |
+----+----------+--------+
| 1  | 5        | 1000   |
| 2  | 5        | -200   |
| 3  | 5        | -100   |
| 4  | 5        | 500    |
+----+----------+--------+

我想要计算每行剩余金额的view.大概是这样的:

+----+----------+--------+------------------+
| id | user_id  | amount | remaining_amount |
+----+----------+--------+------------------+
| 1  | 5        | 1000   | 1000             |
| 2  | 5        | -200   | 800              |
| 3  | 5        | -100   | 700              |
| 4  | 5        | 500    | 1200             |
+----+----------+--------+------------------+

你知道我该怎么做吗?

推荐答案

MySQL8有用于此目的的窗口函数,如SUM() OVER

对于您的样本数据,这将计算每个user_id的运行总和

对于这一功能的工作至关重要的是PARTITION BYORDER BY获得正确的数量

PARTITION BY用于获取user_id的总和,因此如果您有用户5,6,7,8,它将正确地添加(或减go )用户生成的maount剧院.

ORDER BY是需要得到正确的安装在正确的位置.表本质上是不可排序的,因此需要ORDER BY来给出正确的顺序,如果ID发生更改,您将获得另一个装载,因为它将被预先添加到运行和中

SELECT
`id`, `user_id`, `amount`
, SUM(`amount`) OVER(PARTITION BY `user_id` ORDER BY `id`) run_sum
  FROM wallet
id user_id amount run_sum
1 5 1000 1000
2 5 -200 800
3 5 -100 700
4 5 500 1200

fiddle

Mysql相关问答推荐

无法从容器从APS. NET应用程序连接到MySQL服务器容器

SQL中的搜索模式

筛选器中的Case When语句

WordPress的sql命令从帖子中删除随机文本

对匹配两个或多个表的表结果进行排序

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

如果其中一个表为空,则 mysql 中的查询会给出 0 个结果

为两个中的每一个 Select 最大和最小传递条件

优化解析 5000 万行 MySQL 表的请求

SQL / MySQL:如何在WHERE IN中判断类似于OR的AND逻辑

创建表时我的 SQL 语句有什么问题

根据使用 mysql 的第一个过滤结果添加更多表行

在 MySQL 中检测 utf8 损坏的字符

在 MySQL 中重命名外键列

如何在 python 中逐行获取 MySQL ResultSet

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

加快 mysql 转储和导入

带有 OuterRef 的简单子查询

如何将数组存储到mysql中?

从另一个表中 Select 具有 id 的行