如何创建满足同一ID不同行两列数据相等条件的表?
解决SAS Proc SQL筛选同一ID跨行间日期匹配的问题
原语句的问题
你之前的Proc SQL逻辑有误:where (start_date = return_date)是判断同一行的Start_Date和Return_date相等,但你的需求是同一ID下不同行中,某行的Start_Date等于另一行的Return_date,这个条件完全不符合需求。
正确的Proc SQL写法
通过自连接关联表自身,就能实现跨行间的日期匹配筛选:
proc sql; create table new as select distinct t1.ID, t1.Start_Date, t1.Return_date from old_table t1 inner join old_table t2 on t1.ID = t2.ID and t1.Start_Date = t2.Return_date and t1.Start_Date ^= t1.Return_date; -- 可选:排除同一行自身日期相等的情况 quit;
代码说明
inner join old_table t2:把原表拆成两个逻辑表(t1和t2)做关联t1.ID = t2.ID:限定只匹配同一ID的记录t1.Start_Date = t2.Return_date:核心匹配条件,找到t1的起始日期等于t2的归还日期的记录distinct:避免多对多匹配产生重复结果t1.Start_Date ^= t1.Return_date:如果数据里存在同一行日期自相等的情况,且不需要这类记录,可加此条件排除
示例数据的运行结果
执行上述代码后,会得到ID为A的两行记录:
ID Start_Date Return_date A 11/1/21 12/15/21 A 12/15/21 12/20/21
这两行正是匹配的双方——第一行的归还日期等于第二行的起始日期,完全符合筛选需求。
如果只需要保留「起始日期等于其他行归还日期」的行,可改用exists子查询:
proc sql; create table new as select ID, Start_Date, Return_date from old_table t1 where exists ( select 1 from old_table t2 where t2.ID = t1.ID and t2.Return_date = t1.Start_Date and t2.Start_Date ^= t1.Start_Date -- 确保不是同一行 ); quit;
这个写法会只输出示例中的第二行(A 12/15/21 12/20/21)。
内容的提问来源于stack exchange,提问作者vanessa
相关产品推荐
相关产品推荐

