在这种情况下如何使用 SQL 的滞后功能?

How to use lag function of SQL in this situation?

经过几个小时的尝试,我无法得到这个问题的答案。下面是我的专栏,我有计算 MSF 专栏值的公式。

Sr    open      high     low       closed     MSF
-----------------------------------------------------   
1    6107      6116.15   6022.3   6048.25    5214
2    6172.75   6181.05   6124.4   6146.35    Null
3    6141.35   6141.35   6062.35  6079.8     Null
4    6030.9    6051.2    5883.6   5904.6     Null
5    5901.3    5907.25   5740.95  5762.85    Null
6    5767.95   5842.6    5698.2   5754.1     Null
7    5800.05   5874.2    5711.3   5863.25    Null
8    5850.75   5857.75   5736.7   5751.9     Null
9    5752.1    5833.65   5639.65  5654.55    Null

我正在尝试填写名为 MSF 的最后一列。这是计算每行 MSF 值的公式

(closed - previous_value_of_MSF) x 0.33 + previous_value_of_MSF

我很难获得 MSF 的前一行值。请帮忙 帮助将不胜感激。提前致谢。

此任务无法以单一查询形式解决 - 它是迭代的。因此必须使用递归 CTE 或用户定义的变量(或 SP)。例如:

SET @msf:=0;

SELECT *, 
       @msf := CASE WHEN msf IS NULL
                    THEN (closed - @msf) * 0.33 + @msf
                    ELSE msf
                    END AS new_msf
FROM sourcetable
ORDER BY Sr

更新:

SET @msf:=0;

UPDATE sourcetable
SET MSF = ( @msf := CASE WHEN msf IS NULL
                         THEN (closed - @msf) * 0.33 + @msf
                         ELSE msf
                         END )
ORDER BY Sr;

fiddle

PS。使用递归 CTE 似乎提供了更昂贵的解决方案。