Влево присоедините Reference.Data
к Add.Data
, присоединяясь к Person
и к Order.Date
, находящемуся в или до Date
. Сгруппируйте их по исходным Reference.Data
строкам и возьмите максимум Order.Date
из них. Это работает так, что строка Add.Data
, используемая для каждой строки Reference.Data
, будет строкой с максимальным значением Order.Date
, поэтому будет отображаться правильный Order
.
Обратите внимание, что точка - это оператор SQL, а order
- это ключевое слово SQL, поэтому мы должны окружать имена точкой или имя order
(независимо от регистра) в квадратных скобках.
library(sqldf)
sqldf("select r.*, max(a.[Order.Date]) as [Order.Date], a.[Order]
from [Reference.Data] as r
left join [Add.Data] as a on r.Person = a.Person and a.[Order.Date] <= r.Date
group by r.rowid")
дает:
Person Date Order.Date Order
1 John 2019-07-10 2019-07-09 1
Я не проверял, насколько это быстро (добавление индексов может ускорить его, если это необходимо), но эффективность с несколькими тысячами строк вряд ли так важна, как читабельность.