在我的理解中合并 2 个数据集是一对多合并 SAS

Merging 2 data seta in what I understand is one-to many merge SAS

我有2个数据集:

|ColA|ColB
|date1|1
|date2|2
|date3|3

|cola|colb|colc.....|colz|
|blaa|blaa|blaaaaaaa|date1
|blab|blab|blaaaaaab|date1
|blac|blac|blaaaaaac|date1
|blaa|blaa|blaaaaaaa|date2
|blag|blag|blaaaaaag|date3

我想要的是每个日期的数字都等于第一个 table

|cola|colb|colc.....|colz |ColZ+1
|blaa|blaa|blaaaaaaa|date1|1
|blab|blab|blaaaaaab|date1|1
|blac|blac|blaaaaaac|date1|1
|blaa|blaa|blaaaaaaa|date2|2
|blag|blag|blaaaaaag|date3|3

我尝试过的:

 proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum 
from merged_dpd_raw_2602 a
left join work.date_transform b
on datepart(a.reporting_date) = datepart(b.DATE)
;quit;

它只是在上个月加了一个数字。所有其他月份都有一个“。” .

proc sort data=date_transform;
by formatted_date;
run;
proc sort data=merged_dpd_raw_2602;
by formatted_date;
run;

data merged_dpd_raw_2602_B;
 merge date_transform(in=A) merged_dpd_raw_2602(in=B);
 by  formatted_date;
 if A=1 and B=1;

 run;

正确合并,但我不知何故丢失了 310k 数据条目。

我怀疑您不是在尝试合并实际日期而是一个月,因此您很可能使用的是格式化值。因此,将您的日期设置为月初或将它们转换为 YYMM 以合并。

proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum 
from merged_dpd_raw_2602 a
left join work.date_transform b
on intnx('month', datepart(a.reporting_date), 0, 'b') = intnx('month', datepart(b.DATE), 0, 'b')
;quit;

所以我调试的方式如下。

首先使用数据步合并 - 它能够很好地处理多对一。

data merged_dpd_raw_2602_B nomatch;
 merge date_transform(in=__date) merged_dpd_raw_2602(in=__raw);
 by  formatted_date;
 if __date and __raw then output merged_dbd_raw_2602_b;
 else do;
    invar = ifn(__date,'in date','in raw ');
    output nomatch;
 end;
run;

这会向您显示不匹配的记录。重要的是,数据步骤合并的工作方式,它可能会以正确的顺序向您显示记录(但也可能不是,这取决于合并不起作用的原因)。

您可能不太关心“in date”记录,它可能只是您关心的“in raw”变量——假设我知道哪一个是记录最多的那个。查看不匹配的记录,然后尝试找出它们应该匹配的内容(记录可能从“in date”开始就在那里,但如果“in date”记录匹配不同的“原始”记录)。

这可以让您准确了解数据中的错误。