Использование outer apply
:
select o.*, r.*
from orders o outer apply
(select top (1) r.*
from repairs r
where r.customerId = o.customerId and
r.locationid = o.locationid and
r.RepairDate > o.SaleDate
order by r.RepairDate
) r;
Примечание. Вы указываете, что хотите указать первую дату ремонта для клиента . Однако данные свидетельствуют о том, что вы действительно имеете в виду комбинацию клиент / местоположение.
РЕДАКТИРОВАТЬ:
Спасибо за настройку SQL Fiddle. Это проясняет проблему. Я думаю, что этот твик делает то, что вы хотите:
- Ответ от Гордона Линоффа
select o.*, r.*
from (select o.*,
lead(saledate) over (partition by customerid order by saledate) as next_salesdate
from orders o
) o outer apply
(select top (1) r.*
from repairs r
where r.customerId = o.customerId and
r.locationid = o.locationid and
r.RepairDate > o.SaleDate and
(r.RepairDate < o.next_salesdate or o.next_salesdate is null)
order by r.RepairDate
) r;
Здесь - это db <> скрипка.