sql中具有累积自引用计算的mysql视图

ftf50wuq  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(315)

我甚至不知道该怎么称呼我要做的事。我需要一个列来累计它自己对前几行的计算。下面是我需要的输出的简化示例(d是我需要帮助的列):

a   b   c   d   e
1   36  6   36  6
2   0   5   30  6
3   0   4   24  6
4   22  10  40  4
5   0   9   36  4
6   0   8   32  4

是自动编号列
b是用户输入的列
c是一个通常倒计时1的列,但偶尔会添加其他值
d等于:d的前一行+b-e的前一行
e等于d/c
如果我解释一下我为什么需要这个也许会有帮助。我正在研究模拟利率冲击对银行机构的影响(通常称为压力测试)。b是表示利率冲击的某种影响的列(例如:贷款数量的百分比变化)。c是一列,表示市场在没有任何进一步的利率冲击的情况下有望恢复正常的月份数。d代表该时期对贷款的影响,e是d归零的比率。
以下是我迄今为止尝试过的方法以及它不起作用的原因:

SET var := 0;

SELECT var := var + b - var/c AS d

这是我的首选解决方案,但我正在创建一个视图,视图不允许引用用户创建的变量。它必须是一个视图,因为我需要在其他查询和视图中引用它。

SELECT (lag(d,1,0) OVER (ORDER BY a)) + b - (lag(e,1,0) OVER (ORDER BY a)) AS d

这不起作用,因为d还没有定义。我只是得到一个错误,d不是一列。

SELECT
     ((SELECT sum(temp.b)
     FROM table as temp
     WHERE temp.a <= a)
     /(SELECT sum(temp2.c)
     FROM table as temp2
     WHERE temp2.a = a))

这不起作用,因为我需要除以d的约化值,而不仅仅是b的和。

atmip9wb

atmip9wb1#

d 两者之差的累计和 b 以及 c . 这将表示为:

select a, b, c,
       sum(b - c) over (order by a) as d,
       d / sum(b - c) over (order by a) as e
from t;

我使用的是窗口函数,尽管问题被标记为mysql。mysql仅从版本8.0开始支持它们。

6vl6ewon

6vl6ewon2#

我用暴力解决了这个问题。我创建了一个永久表,然后创建了一个触发器,删除表中的所有行,然后使用变量解决方案重新创建表。因此,每当底层数据发生变化时,mysql都会用最新的信息自动更新表。表的作用类似于视图,因为它是实时更新的,但却是一个永久表。
不幸的是,mysql并没有为触发器提供for every语句选项,这意味着我的代码会为每一行更新一遍又一遍,所以如果我更新100行,我的表就会被删除并重新创建100次。
仍在寻找更好的解决方案,但至少这是可行的。

x6yk4ghg

x6yk4ghg3#

我不确定结果在视图中有多稳定,但可以使用会话变量。

SELECT a, b, c, @d := @d + b - @e AS d, @e := @d / c AS e
FROM t
   , (SELECT @d := 0 AS initD, @e := 0 AS initE) As init
ORDER BY a;

另外,请记住,这是一种行为的观察,而不是实际上保证跨越;因为mysql没有正式保证select表达式是从左到右计算的。

相关问题