SQL Server не поддерживает параметр IGNORE NULLS
для LAG()
или LAST_VALUE()
.На самом деле это самый простой метод.
Вместо этого вы можете использовать APPLY
:
select d.*, a.balance
from dates d outer apply
(select top (1) a.*
from a
where a.date <= d.date
order by a.date desc
) a;
или эквивалент с использованием коррелированного подзапроса:
select d.*,
(select top (1) a.*
from a
where a.date <= d.date
order by a.date desc
fetch first 1 row only
)
from dates d;
Это будетработать как в MySQL, так и в SQL Server с предостережением, которое вам необходимо LIMIT
в MySQL.
При этом, если у вас большой объем данных (что маловероятно при гранулярности «даты»), тодва шага оконных функций, вероятно, являются лучшим решением:
select ad.date,
max(ad.balance) over (partition by grp) as balance
from (select d.date, a.balance,
count(a.date) over (order by d.date) as grp
from dates d left join
a
on d.date = a.date
) ad;
Подзапрос назначает «группу» каждому значению баланса и последующим датам.Эта «группа» затем используется для назначения баланса во внешнем запросе.
Эта версия будет работать как в MySQL, так и в SQL Server.