Обновление для использования значения предыдущей строки

#sql #sql-server #database

#sql #sql-сервер #База данных

Вопрос:

У меня есть таблица, в которой есть следующие столбцы Date, Ticker, Return. Я хотел бы добавить новый столбец в таблицу «Price_Computed», где Price_Computed начинается со значения 100 для первой даты, а затем вычисляется следующим образом Price_Computed = Price_Computed (PreviousDate) * Возврат с текущей даты См. Прилагаемый скриншот.

Пример

введите описание изображения здесь

Я использую SQL Server 2019 и не понимаю, как это сделать. Спасибо.

Комментарии:

1. Это похоже на текущий итог.

Ответ №1:

Я бы рекомендовал рекурсивный подзапрос:

 with t as (
      select date, ticker, return, 100 as value,
             row_number() over (partition by ticker order by date) as seqnum
      from table t
     ),
     cte as (
      select date, ticker, return, value, seqnum
      from t
      where seqnum = 1
      union all
      select t.date, t.ticker, t.return, cte.value * (1   t.return), t.seqnum
      from cte join
           t
           on t.seqnum = cte.seqnum   1
     )
select *
from cte;
 

Что вам действительно нужно, так это функция кумулятивного продукта. В SQL Server нет встроенного. Вы можете имитировать его, используя журналы и показатели; однако я считаю, что при таком подходе ошибки накапливаются довольно быстро.

Комментарии:

1. когда я запускаю это, я получаю «Рекурсивное общее табличное выражение ‘cte’ не содержит оператора объединения ВСЕХ верхнего уровня»?

2. @dman . . . Это большая оплошность. Интересно, не удалил ли я случайно, когда публиковал ответ.

3. Спасибо! Я ценю это! Мне пришлось внести две модификации 1.) в анкорном запросе добавьте seqnum для объединения всех 2.) У меня было 12 миллионов строк, поэтому мне нужно было установить бесконечную рекурсию