Если вы хотите сделать это, используя только оконные функции, вы можете использовать:
select at.*,
max(case when prev_date = dateadd(day, -1, date) then prev_BalanceEndOfDay end) over (partition by date) as prev_BalanceEndOfDay
from (select at.*,
lag(BalanceEndOfDay) over (order by date) as prev_BalanceEndOfDay,
lag(date) over (order by date) as prev_date
from accounttransactions at
) at;
Примечание. Это означает, что «предыдущий день» ровно за день до этого. Это означает, что «накануне в данных», тогда первое сравнение должно быть просто max(case when prev_date <> date . . . )
.
Здесь - это db <> скрипка.
Примечание что в базах данных, которые полностью поддерживают спецификацию окна range
, это можно сделать напрямую с помощью logi c следующим образом:
max(BalanceEndOfDay) over (order by datediff(day, '2000-01-01', date)
range between 1 preceding and 1 preceding
)
Увы, SQL Сервер не поддерживает эту (стандартную) функциональность.