Как использовать функцию отставания SQL в этой ситуации? - PullRequest
0 голосов
/ 04 марта 2020

Пытаясь много часов, я не мог получить ответ на этот вопрос. Это мои столбцы ниже, и у меня есть формула для расчета значений 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 для предыдущих строк. Пожалуйста, помогите Помощь будет оценена. Заранее спасибо.

1 Ответ

1 голос
/ 04 марта 2020

Эта задача не может быть решена в одной форме запроса - она ​​итерационная. Поэтому необходимо использовать либо рекурсивную 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;

скрипка

PS. Использование рекурсивного CTE кажется более дорогим решением.

...