You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建满足同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:50:26