合并覆盖在第一次比赛时停止

时间:2019-07-05 15:36:58

标签: merge sas one-to-many

我目前在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;

2 个答案:

答案 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;