#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 миллионов строк, поэтому мне нужно было установить бесконечную рекурсию