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

如何在SAS Enterprise Guide的PROC SQL中生成状态变更0/1标记列

在SAS Enterprise Guide中用PROC SQL实现COL1列的生成需求

你需要基于table123生成COL1列,核心规则是:当同一ID下出现从VAL1=PR变更为VAL2=P/M的记录,且后续没有在4个月内改回VAL1=PR的情况,该ID的所有记录COL1为1;其他情况COL1为0。

以下是实现该需求的PROC SQL代码:

PROC SQL;
CREATE TABLE desired_result AS
SELECT 
    t1.ID,
    t1.DT,
    t1.VAL1,
    t1.VAL2,
    CASE
        /* 先筛选出存在PR转P/M变更的ID */
        WHEN t1.ID IN (
            SELECT DISTINCT ID
            FROM table123
            WHERE VAL1 = 'PR' AND VAL2 IN ('P','M')
        )
        /* 再判断该ID后续是否没有在4个月内改回PR */
        AND NOT EXISTS (
            SELECT 1
            FROM table123 t2
            WHERE t2.ID = t1.ID
            AND t2.DT > t1.DT
            AND t2.VAL1 = 'PR'
            /* 把数值型DT转为SAS日期,计算月份差 */
            AND INTCK('MONTH', INPUT(PUT(t1.DT,8.), YYMMDD8.), INPUT(PUT(t2.DT,8.), YYMMDD8.)) <= 4
        )
        THEN 1
        ELSE 0
    END AS COL1
FROM table123 t1
ORDER BY t1.ID, t1.DT;
QUIT;

代码逻辑拆解

  1. 筛选目标ID
    子查询先找出所有发生过「VAL1=PR→VAL2=P/M」变更的ID,例子中的123、222会被选中,38、991直接排除。

  2. 验证改回时间
    通过NOT EXISTS子查询检查:当前ID的每条记录之后,是否存在VAL1变回PR且时间间隔≤4个月的记录。如果不存在,说明改出PR后超过4个月未改回,符合COL1=1的条件。

    • 用INPUT(PUT(DT,8.), YYMMDD8.)把数值型的DT转换为SAS可识别的日期格式,再用INTCK函数精准计算月份差,避免日期格式误差。
  3. CASE语句输出结果
    只有同时满足「存在PR转P/M变更」和「后续4个月内未改回PR」的ID,所有记录的COL1才会设为1,其余情况均为0。

对应示例结果的验证

  • ID=123:存在PR转P的记录,后续记录距离变更日期的月份差为7个月,且无改回PR的记录,因此COL1全为1。
  • ID=222:虽有PR转M的变更,但后续仅2个月就改回PR,因此COL1全为0。
  • ID=38:未发生PR转P/M的变更,COL1为0。
  • ID=991:初始VAL1不是PR,无符合规则的变更,COL1为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:45:33