无重复项的SAS proc sql内部联接

无重复项的SAS proc sql内部联接,sas,proc-sql,Sas,Proc Sql,我正在努力使用procsql连接两个表而不创建重复的行(不确定是否有其他方法更有效) 内部联接打开:datepart(table1.date)=datepart(table2.date)和tag=tag,ID=ID 我认为问题在于表1中的日期和名称不同。只要看一下表,就可以清楚地看到表1的第1行应该与表2的第1行连接起来,因为事务在表1中是在00:04开始的,在表2中是在00:06结束的。我的问题是,我不能加入带有时间戳的日期,所以我删除了时间戳,因为它创建了重复项 Table1: id ta

我正在努力使用procsql连接两个表而不创建重复的行(不确定是否有其他方法更有效)

内部联接打开:datepart(table1.date)=datepart(table2.date)和tag=tag,ID=ID

我认为问题在于表1中的日期和名称不同。只要看一下表,就可以清楚地看到表1的第1行应该与表2的第1行连接起来,因为事务在表1中是在00:04开始的,在表2中是在00:06结束的。我的问题是,我不能加入带有时间戳的日期,所以我删除了时间戳,因为它创建了重复项

Table1:

id tag    date            amount   name_x
1 23      01JUL2018:00:04  12          smith ltd
1 23      01JUL2018:00:09  12          anna smith



table 2:



id tag  ref   amount   date
1 23   19   12          01JUL2018:00:06:00
1 23   20   12          01JUL2018:00:10:00



Desired output:

id tag    date            amount   name_x       ref
1 23      01JUL2018  12          smith ltd       19
1 23      01JUL2018  12          anna smith      20
谢谢你的帮助。
谢谢

您需要为该日期时间联接设置边界。你是正确的,为什么你会得到重复。我猜下界是前一个日期时间,如果它存在,上界是这个记录的日期时间

顺便说一句,这是某人糟糕的数据库设计

让我们首先按照
id
tag
date
对表2进行排序

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;
procsqlnoprint;
创建所需的表作为
选择a.id、a.tag、a.date、a.amount、a.name\u x、b.ref
从表1中作为
内连接
临时助理秘书长
在a.id=b.id上
和a.tag=b.tag

和b.low_date
data table1;
input id tag date:datetime21.   amount   name_x $15.;
format date datetime21.;
cards;
1 23 01JUL2018:00:04 12 smith ltd
1 23 01JUL2018:00:09 12 anna smith
;

data table2;
input id tag  ref   amount   date: datetime21.;
format date datetime21.;
cards;
1 23 19 12 01JUL2018:00:06:00
1 23 20 12 01JUL2018:00:10:00
;


proc sql;
   select a.*,b.ref from table1 a inner join table2 b
   on a.id=b.id and a.tag=b.tag
   group by a.id,a.tag,a.date
   having abs(a.date-b.date)=min(abs(a.date-b.date));
quit;