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

在SAS中如何查找ID序列中缺失的编号?

查找SAS数据集中连续ID序列的缺失编号

这里提供两种实用的SAS代码方案,帮你找出连续ID序列里的缺失编号:

方法一:数据步逐行对比

如果数据集还没按ID排序,先做排序确保序列有序,再通过保留上一个ID的值,对比当前ID与前一个ID的差值,找出中间的缺失项:

/* 按ID排序(若数据集未排序) */
proc sort data=have;
    by id;
run;

/* 提取缺失ID */
data missing_ids;
    set have;
    retain prev_id;
    if _n_ = 1 then do;
        /* 检查序列起始是否有缺失(比如ID从3开始,补1、2) */
        if id > 1 then do;
            do missing_id = 1 to id - 1;
                output;
            end;
        end;
    end;
    else do;
        /* 对比当前ID与上一个ID,差>1则中间的都是缺失项 */
        if id > prev_id + 1 then do;
            do missing_id = prev_id + 1 to id - 1;
                output;
            end;
        end;
    end;
    prev_id = id;
run;

/* 查看结果 */
proc print data=missing_ids noobs;
    var missing_id;
run;

方法二:PROC SQL生成完整序列后匹配

先获取ID的最小和最大值,生成这个范围内的完整ID序列,再通过左连接找出原数据集中不存在的ID:

/* 获取ID的范围 */
proc sql noprint;
    select min(id), max(id) into :min_id, :max_id from have;
quit;

/* 生成完整序列并匹配缺失项 */
proc sql;
    select t1.id as missing_id
    from (select &min_id. + monotonic() - 1 as id 
          from sashelp.class(obs=&max_id. - &min_id. + 1)) t1
    left join have t2 on t1.id = t2.id
    where t2.id is null
    order by missing_id;
quit;

补充说明

  • 如果你的ID序列起始不是1,方法一中的1替换成实际起始值即可;方法二会自动用ID的最小值作为起始,无需手动调整。
  • 若需要检查序列终点之后的缺失(比如预期到15但实际到10),可以手动调整&max_id.为预期最大值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:05:17