全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2864 0
2015-06-12
这个宏是用来提取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);


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群