这个宏是用来提取PayType的众数的值,但具体是如何展开,运行的?(该宏亲测有效,正确)
感觉这个sql code 比较高级,被优化过的。理解不了!!!!
特别是子子查询里WHERE p2.&IDVar= p1.&IDVar,这个具体是如何连接上的
自己另写了一个简单的sql code,效果一样
/* Macro VarMode */
/*******************************************************/
%macro VarMode(TransDS, IDVar, XVar, OutDS);
/* Calculation of the mode of a variable Xvar from a transaction
dataset using the classic implementation in ANSI SQL */
proc sql noprint;
create table &OutDS as
SELECT &IDVar , MIN( &XVar ) AS mode
FROM (
SELECT &IDVar, &XVar
FROM &TransDS p1
GROUP BY &IDVar, &XVar
HAVING COUNT( * ) =
(SELECT MAX( CNT )
FROM (SELECT COUNT( * ) AS CNT
FROM &TransDS p2
WHERE p2.&IDVar= p1.&IDVar
GROUP BY p2.&XVar
) AS p3
)
) AS p
GROUP BY p.&IDVar;
quit;
%mend;
data Trans;
informat TransDate date9.;
format TransDate Date9.;
informat PayType $10.;
input CustID TransDate PayType $ @@;
datalines;
1 16Jan2008 Check 1 07Feb2008 Check
1 09Mar2008 Check 1 18Apr2008 Check
1 19May2008 Transfer 1 22Jun2008 Transfer
1 08Jul2008 Check 1 23Aug2008 Transfer
1 14Sep2008 Transfer 1 08Oct2008 Check
2 15Jan2008 Transfer 2 12Feb2008 Check
2 12Mar2008 Transfer 2 19Apr2008 Check
2 22May2008 Transfer 2 28Jun2008 Transfer
2 26Jul2008 Transfer 2 25Aug2008 Transfer
2 20Sep2008 Check 2 21Oct2008 Check
3 04Jan2008 Check 3 17Feb2008 Check
3 19Mar2008 Check 3 19Apr2008 Check
3 25May2008 Check 3 23Jun2008 Transfer
3 21Jul2008 Transfer 3 15Aug2008 Transfer
3 11Sep2008 Check 3 19Oct2008 Transfer
;
run;
%let DSin=Trans;
%let IDVar=CustID;
%let XVar=PayType;
%let DSout=ModePayType;
%VarMode(&DSin, &IDVar, &XVar, &DSout);