无重复项的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结束的。我的问题是,我不能加入带有时间戳的日期,所以我删除了时间戳,因为它创建了重复项无重复项的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
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;