MySQL 运行总计算列消息

Posted

技术标签:

【中文标题】MySQL 运行总计算列消息【英文标题】:MySQL running total computed column message 【发布时间】: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 开始。这在我看来也是可以在应用程序中轻松完成的事情。 【参考方案1】:

没有ORDER BY,结果集的顺序是不确定的,您的查询可能会在每次执行时返回不同的结果。

假设结果集应该按post_date 排序并且总和应该从0(而不是100)开始,以下基于窗口函数的查询会产生相同的结果集:

SELECT
  `post_date`,
  `category`,
  `amount`,
  SUM(`amount`) OVER (ORDER BY `post_date` ASC) AS `running_total`
FROM `credit_card`;

Why the functionality was deprecated:

重要更改:在 SET 以外的语句中设置用户变量 由于此处列出的问题,现已弃用:

涉及用户变量的表达式的求值顺序是 未定义。

变量的默认结果类型基于其在 声明的开头,这可能会产生意想不到的影响 在语句开头保存一种类型的值的变量 在同一个语句中被分配了一个不同类型的新值。

引用变量时的 HAVING、GROUP BY 和 ORDER BY 子句 在选择表达式列表中分配了一个值,不起作用 正如预期的那样,因为表达式是在客户端上评估的,所以 前一行中的陈旧列值可能是 用过。

【讨论】:

以上是关于MySQL 运行总计算列消息的主要内容,如果未能解决你的问题,请参考以下文章

Mysql LEFT JOIN with count 返回未知列

更快地计算pandas中列表列中值的总出现次数?

MySQL:获取组列表及其总成员数

如何计算从 MySQL 查询返回的总结果有限制?

[MySQL]--MySQL表中某个列插入数据总被截断,报编码方式的语法错误,实际是column的not null属性和更改编码语法导致的冲突。

计算MySQL中的运行总计