在进行模糊合并时使用 proc sql 删除重复项

Using proc sql to remove duplicates when doing a fuzzy merge

我有一个文件,其中的唯一键是 pt_num 和日期。

data person;
   input pt_num day ;
   format day date9.;
   datalines;
12 5
12 6
run;

我想将它与一个文件 (clms) 合并,该文件在整个时间段内都有一系列声明。合并期间,我想做一个五天的回溯,只输出一次dx_cd。

data clms;
   input pt_num clmdate dx_cd;
   format clmdate date9.;
   datalines;
12 3 1
12 5 1
12 6 2
run;

目前,我正在使用 proc SQL 合并,然后使用 proc 排序删除重复项。

proc sql;
  create table disease as 
    select p.pt_num, p.day, c.dx_cd from person P 
    left join clms C    
    on p.pt_num = c.pt_num and c.clmdate ge p.day-5 and c.clmdate le p.day;
quit;

proc sort data=disease nodupkey ; by pt_num day dx_cd; run;

最终,我使用数据步骤和 SAS 数组使文件变长。最终输出看起来像这样。 “1”表示 dx 在五天回顾期间发生,“0”表示没有发生。变量名称将是前一个 table.

行中的名称
data final;
     input pt_num clmdate dx_1 dx_2;
     datalines;
12 5 1 0
12 6 1 1
run;

这些文件很大(一个文件的 nodup 排序需要 2 个小时,我必须多次执行此操作)。我一直在尝试使用分组功能在 SQL 步骤中删除重复项,但没有成功。我假设在 SQL 过程中删除重复项会减少时间,但我可能错了。

proc sql;
  create table disease as 
    select p.pt_num, p.day, c.dx_cd
    from person P 
    left join clms C    
     on p.pt_num = c.pt_num and
           c.clmdate ge p.day-5 and
           c.clmdate le p.day
    group by dx_cd
    order by pt_num, day, dx_cd;
quit;

我希望这个解释是清楚的。这样做的目的是生成最终将用于创建倾向得分的协变量列表。 PS 将在不同的时间点重新计算,这就是我创建患者日文件的原因。

谢谢, 劳拉

尝试将 DISTINCT 添加到 SQL 查询中,但不确定它是否会节省您的总体时间。

proc sql;
  create table disease as 
    select DISTINCT p.pt_num, p.day, c.dx_cd from person P 
    left join clms C    
    on p.pt_num = c.pt_num and c.clmdate ge p.day-5 and c.clmdate le p.day;
quit;

我会通过 PT_NUM 推荐 indexing 你的数据 如果您有足够的 RAM 来存储数据,则 SASFILE 语句将有助于加快您的进程。

使用SASFILE语句将常用SAS数据集加载到内存中

By default, any SAS data set that is processed by a SAS procedure or DATA step is closed at the conclusion of the procedure or step. This action causes the buffers to be released and any updated pages to be written to disk. If a subsequent procedure or step needs to read or update the SAS data set again, the same pages that were already in buffers might need to be read back from disk again. Such extra I/O can be avoided by specifying two SASFILE statements:

  • one statement to open or load the SAS data set before the procedures or DATA steps in which the data set is used Note: The SASFILE statement loads the entire member into memory. That is, it ignores any previous setting of the OBS option.
  • a second statement to close the data set after its last use within the SAS session