【发布时间】:2020-12-12 23:50:31
【问题描述】:
我正在使用以下查询来计算我的信用卡的流动余额。我的银行在其网站上没有提供运行余额列,所以我使用 SQL 查询自己计算它。此代码适用于我,除了我的 IDE 显示以下警告消息,“在表达式中设置用户变量已被弃用,将在未来版本中删除。考虑替代方案:'SET variable=expression, ...',或'SELECT 表达式 INTO 变量'".
SET @running_sum = 100;
SELECT
post_date,
category,
amount,
(@running_sum := @running_sum + amount) AS running_total
FROM credit_card;
我还注意到 MySQL 版本 8 第 9.4 节用户定义变量下的以下语句,“以前的 MySQL 版本可以在 SET 以外的语句中为用户变量赋值。此功能在MySQL 8.0 用于向后兼容,但可能会在未来的 MySQL 版本中删除"。
从这些消息看来,MySQL 不喜欢我在查询 (@running_sum := @running_sum + amount) 中使用此表达式。但是,我不能完全理解我应该如何重写这个查询,这样我才能达到计算运行平衡的相同结果,并符合 MySQL 8 版的代码风格。
提前感谢您的回复。
【问题讨论】:
-
这能回答你的问题吗? Cumulative sum over a set of rows in mysql
-
谢谢 Ulrich,我忘记在原始查询中使用 ORDER BY 子句,但它仍然有效,因为我以正确的顺序填充了表中的条目。我仍然同意您的观点,最好使用 ORDER BY 子句来确保以正确的顺序执行计算。我测试了 SUM 窗口函数,但正如您所说,它假设初始值从 0 开始,而不是从某个任意值开始。有没有办法仍然使用 SUM 窗口函数,但先将其初始化为某个起始值。
-
另外,您知道在计算列中使用这样的表达式 (@running_sum := @running_sum + amount) 的一般问题是什么?在我看来,与使用 SUM 窗口函数相比,这个表达式的作用更容易理解,我仍然需要重新阅读才能更好地理解。
-
人口的顺序可以对结果集产生影响,但是如果没有
ORDER BY,则允许 DBMS 以它认为合适的任何顺序返回结果集。它可能会以它可以最有效地计算的顺序返回行。这可以是人口的顺序,但也可以是其他任何东西。 -
不,我不知道如何使用窗口 SUM 函数从 100 开始。这在我看来也是可以在应用程序中轻松完成的事情。
标签: mysql sql variables window-functions