NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。~SASログ入門 #3~
データセットとデータセットの結合に使う みんな大好き mergeステートメントですが、n対n (多対多)の結合を行うことができません。正確には、n対n の結合をしようとすると、結合はできるのですが、SQLでの n対n の結合のように結合してくれません。
そんな、mergeステートメントで、n対n の結合をしてしまったとき、出てくるNOTEメッセージ「NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。」のご紹介です。
下記は、n対1 の結合をしようとして、間違えて n対n の結合をしてしまったサンプルコードです。
/* 顧客データ */
data CLIENT_MASTER ;
infile cards dlm="," ;
input LATEST_FLG
CHANGED_DATE : date8.
CLIENT_NO
CLIENT_NAME : $20.
BIRTH_DATE : date8.
EMAIL_ADDRESS : $100.
;
format CHANGED_DATE yymmddn8.
BIRTH_DATE yymmddn8.
;
cards ;
1,10DEC2015,001,JOHN,01JAN1980,TEST@TEST.com
0,12JUL2010,001,JOHN,01SEP1980,TEST@TEST.com
1,10DEC2015,002,Emily,01JAN1980,TESUTO@test.com
0,10DEC2015,002,Emily,01JAN1980,
0,10DEC2015,002,Emily,01JAN1981,
1,10DEC2014,003,Ann,12OCT1990,test@test.co.jp
run ;
/* 取引データ */
data TRANSACTION_PROCESS ;
infile cards dlm="," ;
input PROCESS_DT : datetime18.
CLIENT_NO
PRODUCTS : $20.
MONEY
;
format PROCESS_DT nldatm19. ;
cards ;
01JAN2015:10:00:01,001,SHOHIN1,12000
01JAN2015:11:00:00,001,SHOHIN2,100
01JUN2015:12:00:00,001,SHOHIN3,12345
01JUN2015:10:00:00,002,SHOHIN4,120
01JUL2015:10:00:00,003,SHOHIN5,999
run ;
proc sort data=CLIENT_MASTER ;
by CLIENT_NO ;
run ;
proc sort data=TRANSACTION_PROCESS ;
by CLIENT_NO ;
run ;
/* 取引データに、顧客データを結合させる */
data TRANSACTION_PROCESS_EX ;
merge TRANSACTION_PROCESS(in=IN1)
CLIENT_MASTER (in=IN2)
;
by CLIENT_NO ;
if IN1 ;
run ;
データセット CLIENT_MASTER は、顧客情報を保持するデータセットです。同じ顧客情報の変更履歴も保持しています。最新の情報は、LATEST_FLG = 1 となっています。
データセット TRANSACTION_PROCESS は、顧客の取引に関するデータセットです。いつ、どの顧客が、どの商品を、いくらで買ったかが格納されています。取引データなので、同じ顧客が何度でも取引できます。
サンプルでは、取引データに、顧客データを紐付けようとしていますが、最新の情報で絞り込むのを忘れてしまった(という設定の)ため、n対n の結合になっています。
このとき、mergeステートメント時のdataステップの実行ログは以下のようになります。
104 data TRANSACTION_PROCESS_EX ;
105 merge TRANSACTION_PROCESS(in=IN1)
106 CLIENT_MASTER (in=IN2)
107 ;
108 by CLIENT_NO ;
109 if IN1 ;
110 run ;
NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。
NOTE: データセットWORK.TRANSACTION_PROCESSから5オブザベーションを読み込みました。
NOTE: データセットWORK.CLIENT_MASTERから6オブザベーションを読み込みました。
NOTE: データセットWORK.TRANSACTION_PROCESS_EXは7オブザベーション、9変数です。
NOTE: DATAステートメント処理(合計処理時間):
処理時間 0.02 秒
CPU時間 0.02 秒
「NOTE: MERGEステートメントにBY値を繰り返すデータセットが複数あります。」と、こんな感じに、n対n の結合ですよー、大丈夫ですかーとログで教えてくれます。
今回の例では、n対n の間違いとしていますが、意図して merge しているのならば問題ないかと思います。個人的には、意図して作ったものなのか、どうなのかがコメントでも書いていないと判別しづらいのと、結合後のデータセットの内容も分かりづらいので、あまり好きではないです。
ちなみに、データセット TRANSACTION_PROCESS_EX には、以下のような内容が格納されます。
コメント
コメントを投稿