Заменить при l oop на рекурсивный CTE - PullRequest
0 голосов
/ 22 января 2020

У меня есть сценарий while l oop, который проверяет список дат в таблице временных дат и работает до тех пор, пока не пройдет все даты в таблице. Цель состоит в том, чтобы вытащить сальдо разных временных рамок (текущее сальдо и сальдо предыдущего месяца) для каждой отчетной даты во временной таблице.

Мне сказали избегать, пока l oop, когда это возможно, и с запуском сценария. время 20 минут (миллионы данных), я надеялся, что смогу заменить его рекурсивным CTE, но не уверен, как в моем случае.

Пожалуйста, посмотрите на мой текущий пример сценария и посоветуйте.

declare @LatestBusDay date = '1/17/20'
declare @rolling2 date = (select prior_bus_day from datefunction(@LatestBusDay))
declare @rolling3 date = (select prior_bus_day from datefunction(@rolling2))

create table #reportingDates (process_dt date)
insert into #reportingDates 
    select @LatestBusDay
    union select @rolling2
    union select @rolling3

while exists (select * from #reportingDates)
begin

set @dt = (select top 1 process_dt from #reportingDates)
set @tmp_priorMth = (select prior_mth_end from datefunction(@dt)) --getting prior month-end from given @dt

--pull current balance
insert into #balances
select current_balance, 0 as prior_mth_balance
from balancetable
where process_dt=@dt

--pull prior month balance
insert into #balances
select 0 as current_balance, prior_mth_balance
from balancetable
where process_dt=@tmp_priorMth

--aggregate into #result with each loop's reporting date stamp
insert into #result
select sum(current_balance), sum(prior_mth_balance), @dt as report_as_of
from #balances

delete top (1) from #reportingDates
end
...