merge沒(méi)有by語(yǔ)句時(shí)為什么會(huì)報(bào)錯(cuò)
今天在工作中遇到一個(gè)問(wèn)題,就是在整體跑程序的時(shí)候有一個(gè)程序報(bào)錯(cuò)了,問(wèn)題是沒(méi)有為merge語(yǔ)句指定by變量,但是單獨(dú)跑這個(gè)程序的時(shí)候就沒(méi)有問(wèn)題,這個(gè)是使用很久的陳年老程序了,在多個(gè)項(xiàng)目中都有使用,今天不知道為什么會(huì)報(bào)這個(gè)錯(cuò)誤。
merge語(yǔ)句大家都用過(guò),就是對(duì)兩個(gè)或多個(gè)數(shù)據(jù)集進(jìn)行橫向合并,merge后面可以用by語(yǔ)句,也可以不用by語(yǔ)句,他們之間有什么區(qū)別呢?
MEGER 后面沒(méi)有by ,就是按行號(hào)連接的如:
data test1;
merge a b;
run;
也就是a 的第一行接b的第一行,并且如果名稱(chēng)一樣的變量會(huì)被后表覆蓋。第二行接第二行,如此下去。
但是MERGE后面有by的話(huà),如:
data test2;
merge a b;
by id;
run;
那么就是按ID對(duì)接
舉個(gè)例子:
a 表:
id x
01 x1
02 x2
b表 :
id y
01 y1
03 y2
程序
data test1;
merge a b;
run;
的結(jié)果是:
id x y
01 x1 y1
03 x2 y2
而merge by 的結(jié)果是:
id x y
01 x1 y1
02 x2 .
03 . y2
當(dāng)然,Merge by得先排序。
顯然merge后面不使用by語(yǔ)句也是可以的,報(bào)錯(cuò)的原因是在別的程序中設(shè)置了options。在實(shí)際應(yīng)用中,一對(duì)一合并的情形不常見(jiàn),多數(shù)情況是開(kāi)發(fā)人員在進(jìn)行匹配合并時(shí)忘記加BY語(yǔ)句,為了監(jiān)控這種手工錯(cuò)誤的發(fā)生,SAS提供了系統(tǒng)選項(xiàng)MERGENOBY=,這樣就可在發(fā)生這種手工錯(cuò)誤時(shí)給開(kāi)發(fā)人員以必要的提醒,MERGENOBY=有三種取值:
MERGENOBY=NOWARN,這是系統(tǒng)的默認(rèn)選項(xiàng),在執(zhí)行沒(méi)有BY語(yǔ)句的MERGE語(yǔ)句時(shí),系統(tǒng)進(jìn)行一對(duì)一合并。
當(dāng)MERGENOBY=WARN時(shí),系統(tǒng)給出警告,“WARNING:沒(méi)有為MERGE語(yǔ)句指定BY語(yǔ)句”。
當(dāng)MERGENOBY=ERROR時(shí),系統(tǒng)報(bào)錯(cuò),“ERROR:沒(méi)有為MERGE語(yǔ)句指定BY語(yǔ)句”。