Я не уверен, если я интерпретировал сценарий правильно, но вот что я сделал:
Для начала, я создать несколько переменных, чтобы имитировать вход в функцию, а затем составить выражение Рекурсивный Common Table (РКТО) для создания отчета с использованием данных, полученных от этих переменных:
create variable OpenedWith decimal default 5000
;
create variable Factor decimal(2, 1) default 0.1
;
with
t (adjustment) as (values(100), (200), (300))
, ordRows (rn, Adjustment) as
(select row_number() over(), Adjustment from t)
, addRows (rn, Opening, Shift, Adjustment, closing) as
(select rn, OpenedWith, OpenedWith*Factor , Adjustment
, (OpenedWith + (OpenedWith*Factor) + Adjustment)
from ordRows
where rn = 1
union all
select b.rn, a.Closing, a.Closing * Factor , b.Adjustment
, (a.Closing + (a.Closing * Factor) + b.Adjustment)
from addRows a
join ordRows b
on a.rn = (b.rn - 1)
)
select int(rn) as rn, int(opening) as opening
, int(shift) as shift, adjustment
, int(closing) as closing
from addRows
Ниже приводится отчет из приведенного выше запроса:
RN OPENING SHIFT ADJUSTMENT CLOSING
1 5,000 500 100 5,600
2 5,600 560 200 6,360
3 6,360 636 300 7,296
И теперь, чтобы изменить вышеуказанные скриптовые переменные творения и запрос в User Defined Table Function (UDTF), который работает с данными в таблице с именем T:
create function shifted_vals
(OpenedWith decimal(5)
, Factor decimal(3, 2)
)
returns table
(Opening int
, Shift int
, Adjustment int
, Closing int
)
return
with
ordRows (rn, Adjustment) as
(select row_number() over(), Adjustment from t)
, addRows (rn, Opening, Shift, Adjustment, closing) as
(select rn, OpenedWith, OpenedWith*Factor , Adjustment
, (OpenedWith + (OpenedWith*Factor) + Adjustment)
from ordRows
where rn = 1
union all
select b.rn, a.Closing, a.Closing * Factor , b.Adjustment
, (a.Closing + (a.Closing * Factor) + b.Adjustment)
from addRows a
join ordRows b
on a.rn = (b.rn - 1)
)
select opening, shift, adjustment, closing
from addRows
order by rn
Теперь вызвать UDTF с отмеченным значением открытия и фактора в качестве аргументов; то есть больше не зависит от созданных переменных, а вместо значений, полученных через входные параметры:
select t.*
from table(shifted_vals(5000, 0.1)) as t
; -- results as report, follows:
OPENING SHIFT ADJUSTMENT CLOSING
5,000 500 100 5,600
5,600 560 200 6,360
6,360 636 300 7,296
Что определяет сопоставление данных в таблице T так, что может быть определена _прерывная строка_; row_number() over() без особого порядка? Кроме того, 2) в ОП определяется как «Открытие + Сдвиг + Закрытие», но ясно, согласно результатам, выражение должно быть «Открытие + Сдвиг + Коррекция» – CRPence