Остановка перезаписи слияния при первом совпадении - PullRequest
0 голосов
/ 05 июля 2019

В настоящее время у меня есть три набора данных в SAS 9.3. Набор данных «Основной» содержит идентификаторы SKU и идентификаторы клиентов, а также различные другие переменные, такие как неделя.

 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 и location

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 голосов
/ 05 июля 2019

Почему бы не ОБНОВИТЬ СТАНДАРТ (loc) с OVERIDE (oride), а затем объединить с данными клиента.

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;
0 голосов
/ 05 июля 2019

Так SAS объединяет наборы данных.Когда у наборов данных есть наблюдения для внесения вклада в группу BY, значения из наборов данных читаются в порядке, в котором они отображаются в операторе MERGE.Но когда в одном наборе данных заканчиваются новые наблюдения для группы BY, SAS не считывает эти значения. Таким образом, значение, считанное из другого набора данных, больше не заменяется.

Либо удалите исходную переменную и просто используйтезначение из второго набора данных.В основном это настроит слияние от 1 до Много.

Или переименуйте переменную переопределения и добавьте свою собственную логику, когда применять переопределение.

Я не уверен, как вы получаете результат, который выопубликовано, поскольку у вас нет стандартов для CUSTOMER_ID = 2 в опубликованных данных.Если значения местоположения не зависят от customer_id, то почему эта переменная в стандартах и ​​переопределенных наборах данных?

Возможно, вы имели в виду, что в наборе данных стандартов есть только SKU_ID и location?

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;
...