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

SAS技术问询:筛选无24小时前置家庭联系的商务号码记录

我来帮你搞定这个SAS数据筛选的需求,这里有两种实用的方法,分别用DATA步和PROC SQL实现,都能精准得到你想要的结果:

方法一:使用DATA步(高效直观)

这种方法通过排序+保留最近的家庭号码记录时间,快速判断商务号码是否符合条件,执行效率很高。

首先我们先对数据集按客户ID和记录时间排序,保证按顺序处理每个客户的记录:

PROC SORT DATA=HAVE;
    BY ID RECORD;
RUN;

然后用DATA步处理,核心是用RETAIN语句跟踪每个客户最近的家庭号码(TYPE=H)记录时间,再对比商务号码(TYPE=B)的时间:

DATA WANT;
    SET HAVE;
    BY ID;
    RETAIN LAST_H_TIME; /* 保留每个客户最近的H类型记录时间 */
    
    /* 切换到新客户时,重置最近H记录的时间 */
    IF FIRST.ID THEN LAST_H_TIME = .;
    
    /* 如果是H类型记录,更新最近时间并直接删除(我们不需要保留H记录) */
    IF TYPE = 'H' THEN DO;
        LAST_H_TIME = RECORD;
        DELETE;
    END;
    /* 如果是B类型记录,检查距离最近H记录的时间是否超过24小时(86400秒) */
    ELSE IF TYPE = 'B' THEN DO;
        /* 要么从来没有H记录,要么最近的H记录比当前B记录早超过24小时,就保留这条B记录 */
        IF MISSING(LAST_H_TIME) OR (RECORD - LAST_H_TIME) > 86400 THEN OUTPUT;
    END;
RUN;
方法二:使用PROC SQL(子查询方式)

如果你更习惯SQL语法,可以用NOT EXISTS子查询来判断每个B记录的24小时内是否存在前置H记录:

PROC SQL;
    CREATE TABLE WANT AS
    SELECT a.*
    FROM HAVE a
    WHERE a.TYPE = 'B'
      AND NOT EXISTS (
          /* 子查询:检查同一个客户下,是否存在H记录在当前B记录的前24小时内 */
          SELECT 1
          FROM HAVE b
          WHERE b.ID = a.ID
            AND b.TYPE = 'H'
            AND b.RECORD BETWEEN (a.RECORD - 86400) AND a.RECORD
      );
QUIT;

这个逻辑很直接:对于每一条B记录,只要找不到同一个客户在它的前24小时内的H记录,就把这条B记录保留下来。

验证结果

两种方法运行后得到的WANT数据集都会和你期望的输出完全一致:

1 20MAY2018:06:24:28 B
2 24MAY2018:06:24:28 B
5 29MAY2018:07:24:28 B
5 29MAY2018:08:24:28 B

内容的提问来源于stack exchange,提问作者mooch81

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:17:54