Один метод использует union all
и cross apply
:
select ab.product, ab.date, p.price
from ((select a.product, a.date
from a
) union -- intentional to remove duplicates
(select b.product b.date
from b
)
) ab cross apply
(select top (1) a.price
from a
where a.product = ab.product and a.date <= ab.date
order by ab.date desc
) p;
Обратите внимание, что cross apply
удалит строки из b
, которые не имеют цены.
Если поддержка SQLопция ignore nulls
в last_value()
или lag()
, это было бы более уместно с full join
:
select coalesce(a.product, b.product) as product,
coalesce(a.date, b.date) as date,
coalesce(a.price,
lag(ignore nulls a.price) over (partition by coalesce(a.product, b.product) order by coalesce(a.date, b.date)) as price
from a full join
b
on a.product = b.product and a.date = b.date;
Увы, SQL Server (в настоящее время) не поддерживает это.Вы можете сделать это с небольшими усилиями и дополнительными подзапросами.