Working of Merge in SAS (with IN=)

故事扮演 提交于 2021-02-16 05:31:09

问题


I have two dataset data1 and data2

data data1; 
input sn id $;
datalines;
1 a
2 a
3 a
;
run;

data data2; 
input id $ sales x $;
datalines;
a 10 x
a 20 y 
a 30 z
a 40 q
;
run;

I am merging them from below code:

data join;
merge data1(in=a) data2(in=b);
by id;
if a and b;
run;

Result: (I was expecting an Inner Join result which is not the case)

1   a   10  x
2   a   20  y
2   a   30  z
2   a   40  w

Result from proc sql inner join.

proc sql;
select data1.id,sn,sales,x from data2 inner join data1 on data1.hh_id;
quit;

Result: (As expected from an inner join)

a  1  10  x
a  1  20  y
a  1  30  z
a  1  40  w
a  2  10  x
a  2  20  y
a  2  30  z
a  2  40  w
b  3  10  x
b  3  20  y
b  3  30  z
b  3  40  w

I want to know the concept and STEP BY STEP working of merge statement in SAS with In= and proving the above result.

PS: I have read this, and it says

An obvious use for these variables is to control what kind of 'merge' will occur, using if statements. For example, if ThisRecordIsFromYourData and ThisRecordIsFromOtherData; will make SAS only include rows that match on the by variables from both input data sets (like an inner join).

which I guess, (like an Inner Join) is not always the case.


回答1:


Basically, this is a result of the difference in how the SAS data step and SQL process their respective join/merges.

SQL creates a separate record for each possible combination of keys. This is a Cartesian Product (at the key level).

SAS data step, however, process merges very differently. MERGE is really nothing more than a special case of SET. It still processes rows iteratively, one at a time - it never goes back, and never has more than one row from any dataset in the PDV at once. Thus, it cannot create a Cartesian product in its normal process - that would require random access, which the SAS datastep doesn't do normally.

What it does:

For each unique BY value
  Take the next record from the left side dataset, if one exists with that BY value
  Take the next record from the right side dataset, if one exists with that BY value
  Output a row
Continue until both datasets are exhausted for that BY value

With BY values that yield unique records per value on either side (or both), it is effectively identical to SQL. However, with BY values that yield duplicates on BOTH sides, you get what you have there: a side-by-side merge, and if one runs out before the other, the values from the last row of the shorter dataset (for that by value) are more-or-less copied down. (They're actually RETAINED, so if you overwrite them with changes, they will not reset on new records from the longer dataset).

So, if left has 3 records and right has 4 records for key value a, like in your example, then you get data from the following records (assuming you don't alter the data after):

left  right
1     1
2     2
3     3
3     4


来源:https://stackoverflow.com/questions/33612326/working-of-merge-in-sas-with-in

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!