我目前在SAS 9.3中具有三个数据集 数据集“主要”包含SKU ID和客户ID以及其他各种变量(例如周)。
Customer_ID week var2 var3 SKU_ID
1 1 x x 1
1 2 x x 1
1 3 x x 1
1 1 x x 2
1 2 x x 2
2 1 x x 1
2 2 x x 1
2 3 x x 1
2 1 x x 2
2 2 x x 2
数据集“标准”包含每个Customer_ID的标准位置。 数据集“替代”包含特定客户的某个SKU的数据替代位置(如果适用)。因此,它包含SKU_ID,customer_id和位置
standard data set
customer_id location
1 A
1 A
2 C
2 C
override dataset
customer_id sku_id location
1 1 A
1 2 B
合并所有数据集时,这就是我得到的
Customer_ID week var2 var3 SKU_ID location
1 1 x x 1 A
1 2 x x 1 A
1 3 x x 1 A
1 1 x x 2 B
1 2 x x 2 A
2 1 x x 1 C
2 2 x x 1 C
2 3 x x 1 C
相对于我想要的样子
Customer_ID week var2 var3 SKU_ID location
1 1 x x 1 A
1 2 x x 1 A
1 3 x x 1 A
1 1 x x 2 B
1 2 x x 2 B
2 1 x x 1 C
2 2 x x 1 C
2 3 x x 1 C
proc sort data=overrides; by Location SKU_ID; run;
Proc sort data= main; by Location SKU_ID;
run;
Proc sort data= Standard; by Location;
run;
data Loc_Standard No_LOC;
Merge Main(in = a) Standard(in = b);
by Location;
if a and b then output Loc_standard;
else if b then output No_LOC;
run;
/*overwrites standard location if an override for a sku exist*/
Data Loc_w_overrides;
Merge Loc_standard overrides;
by Location SKU_ID;
run;
答案 0 :(得分:0)
这就是SAS合并数据集的方式。当数据集具有有助于BY组的观察值时,将按照它们在MERGE语句中出现的顺序读取数据集的值。但是,当一个数据集用完BY组的新观测值时,SAS不会读取这些值。因此,不再替换从另一数据集读取的值。
要么删除原始变量,要么使用第二个数据集中的值。基本上,这将设置一对多的合并。
或重命名覆盖变量,并添加您自己的何时应用覆盖的逻辑。
由于您发布的数据中没有CUSTOMER_ID = 2的任何标准,因此我不确定您如何获得发布的结果。如果location的值不依赖于customer_id,那么为什么该变量在标准中覆盖了数据集?
也许您是说标准数据集仅具有SKU_ID和位置?
data main_w_standards;
merge main standards;
by sku_id ;
run;
proc sort data=main_w_standards;
by customer_id sku_id;
run;
data main_w_overrides;
merge main_w_standards overrides(in=in2 rename=(location=override));
by customer_id SKU_ID;
if in2 then location=override;
drop override;
run;
答案 1 :(得分:0)
为什么不使用OVERIDE(oride)更新STANDARD(loc),然后与客户数据合并。
data loc;
input customer_id Sku_id location:$1.;
cards;
1 1 A
1 2 A
;;;;
proc print;
data oride;
input customer_id sku_id location:$1.;
cards;
1 1 A
1 2 B
;;;;
run;
proc print;
data locoride;
update loc oride;
by cu: sk:;
run;