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

如何删除SAS中LIB1.KI表的重复数据?附2007-2022年数据插入宏代码

清理LIB1.KI表中的重复数据方案

针对你需要删除LIB1.KI表中从2007-2022年SI库表插入的重复数据的需求,提供两种思路的解决方案:

一、事后清理已存在的重复数据

如果数据已经全部插入完成,直接对LIB1.KI表做去重处理:

方法1:用PROC SORT快速去重

适用于按所有字段或指定字段判断重复,默认保留第一条重复记录:

/* 按所有字段判断重复,保留第一条 */
proc sort data=LIB1.KI nodupkey;
    by _all_;
run;

/* 若只需按特定字段(如id、业务日期)判断重复,替换为对应字段 */
proc sort data=LIB1.KI nodupkey;
    by id biz_date;
run;

方法2:用PROC SQL灵活去重

可以更精准地选择保留哪一条重复记录(比如最新/最早的):

/* 保留所有字段完全唯一的记录 */
proc sql;
    create table LIB1.KI as
    select distinct *
    from LIB1.KI;
quit;

/* 按核心字段分组,保留最新插入的记录(假设存在insert_time字段) */
proc sql;
    create table LIB1.KI as
    select *
    from LIB1.KI
    group by id, order_no /* 替换为业务上判断重复的核心字段 */
    having max(insert_time) = insert_time;
quit;

二、修改插入宏从源头避免重复

如果还在插入数据,或者后续还要继续插入,修改原宏在插入时就排除已存在的记录,比事后清理更高效:

%macro KI;
%do I=2007 %to 2022 ;
    proc sql noprint;
        /* 修正原宏的表名匹配:原插入的是SI.SIQ&I.,所以这里memname应为SIQ&I. */
        select nliteral(name) into :varlist separated by ','
        from dictionary.columns
        where libname='SI' and memname="SIQ&I.";
        
        /* 插入时仅添加LIB1.KI中不存在的记录 */
        insert into LIB1.KI (&varlist)
        select &varlist
        from SI.SIQ&I. source
        where not exists (
            select 1
            from LIB1.KI target
            /* 替换为业务上判断重复的核心字段组合 */
            where target.id = source.id 
              and target.biz_date = source.biz_date
        );
    quit;
%end;
%mend;
%KI;

注意事项

  • 务必先明确业务上的重复定义:是所有字段完全一致才算重复,还是特定主键/组合字段重复即视为重复,这决定了去重逻辑的字段选择。
  • 操作前建议先备份LIB1.KI表,避免误操作导致数据丢失:
data LIB1.KI_backup;
    set LIB1.KI;
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:37:14