Вам необходимо установить границу для этого соединения даты и времени. Вы правы в том, почему вы получаете дубликаты. Я предполагаю, что нижняя граница - это предыдущая дата-время, если она существует, а верхняя граница - это дата-время этой записи.
Кроме того, это плохой дизайн базы данных с чьей-то стороны ...
Давайте сначала отсортируем table2 по id
, tag
и date
proc sort data=table2 out=temp;
by id tag date;
run;
Теперь напишите шаг данных, чтобы добавить предыдущую дату для уникальных id/tag
комбинаций.
data temp;
set temp;
format low_date datetime20.
by id tag;
retain p_date;
if first.tag then
p_date = 0;
low_date = p_date;
p_date = date;
run;
Теперь обновите ваше объединение, чтобы использовать диапазон дат.
proc sql noprint;
create table want as
select a.id, a.tag, a.date, a.amount, a.name_x, b.ref
from table1 as a
inner join
temp as b
on a.id = b.id
and a.tag = b.tag
and b.low_date < a.date <= b.date;
quit;