楼主: 带发修行僧
4656 20

如何寻找离职的人员 [推广有奖]

11
jeozu 发表于 2014-5-2 22:29:34
带发修行僧 发表于 2014-5-2 22:00
这个我已经修改了。刚才贴的log可能位置不对,请看这张图,谢谢
你试一下这个?
  1. proc sql noprint;
  2.     create table final as
  3.     select b.firmid
  4.          , b.fyear
  5.          , ifn(c.out>0, 1, 0)    as  turnover
  6.     from (select distinct firmid, fyear from sample1 order by firmid, fyear) b left join (
  7.         /*count the number of resigned employee*/
  8.          select firmid
  9.               , fyear
  10.               , count(directorid) as out
  11.            from (
  12.             /*exclude retained employee*/
  13.                 select aa.firmid
  14.                      , aa.fyear
  15.                      , aa.directorid
  16.                      , bb.directorid as tmp
  17.                 from sample1 aa left join (
  18.                         /*retained employee */
  19.                         select a.firmid
  20.                              , b.fyear
  21.                              , a.directorid
  22.                         from sample1 a, sample1 b
  23.                         where a.firmid    = b.firmid
  24.                           and a.directorid = b.directorid
  25.                           and a.fyear +1 = b.fyear
  26.                         )bb
  27.                  on aa.firmid=bb.firmid
  28.                 and aa.fyear=bb.fyear
  29.                 and aa.directorid=bb.directorid
  30.                  )
  31.            where tmp is missing
  32.            group by firmid, fyear
  33.     )c
  34.     on b.firmid=c.firmid
  35.    and b.fyear=c.fyear
  36.     ;
复制代码

12
jeozu 发表于 2014-5-2 22:31:14
带发修行僧 发表于 2014-5-2 22:00
这个我已经修改了。刚才贴的log可能位置不对,请看这张图,谢谢
对了, 把SAS关了重新打开一下试试。有可能是以前的statement没有关闭。

13
mingfeng07 学生认证  发表于 2014-5-2 22:59:42
以下程序是针对1999年到2007年间,你可以自己修改年份,或者修改成宏,将年份作为参数也可以。
  1. data a;
  2. input firm $ year name $ name_id $;
  3. cards;   
  4. A            1999         JACK            001         
  5.    A          1999         BEN             002         
  6.    A            1999         GOOD         010         
  7.    A            1999         RICK            011         
  8.    A            1999         XX               012         
  9.    A            1999         XXX             013         
  10.    A            2000         JACK            001         
  11.    A            2000         BEN             002         
  12.    A            2000         Jason          037         
  13.    A            2000         RICK            011        
  14.    A            2000         XX               012         
  15.    A            2000         XXX             013   
  16. ;
  17. run;
  18. proc sort data=a out=b;
  19. by name_id year;
  20. run;
  21. data c;
  22. set b;
  23. run;
  24. proc sort data=c nodupkey;by name_id;run;
  25. data d;
  26. set c;
  27. do year=1999 to 2007;
  28. output;
  29. end;
  30. run;
  31. proc sort data=d out=e;by name_id year;
  32. run;
  33. data test;
  34. merge b(in=a) e(in=b);
  35. by name_id year;
  36. if a=0 or b=0 then turnover=1;
  37. else turnover=0;
  38. run;
复制代码
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

14
带发修行僧 发表于 2014-5-2 23:09:31
jeozu 发表于 2014-5-2 22:29
你试一下这个?
SAS_LOG1

重新试验了一下,仍然还是老问题

15
带发修行僧 发表于 2014-5-5 20:19:13
jeozu 发表于 2014-5-1 02:08
我犯了一个错,忘了是在SAS里。去掉了subquery里的order by就一切正常了。
非常感谢。能够再追问一个问题吗:如何在final表格中再加上一个变量,统计公司当年离职的人数?

16
jeozu 发表于 2014-5-5 20:23:12
带发修行僧 发表于 2014-5-5 20:19
非常感谢。能够再追问一个问题吗:如何在final表格中再加上一个变量,统计公司当年离职的人数?
写代码的时候就猜到你会有这个问题,所以留了这个变量,只是没有最后显示出来。
在最后一个表格中添加一行
  1. , c.out  as resigned  
复制代码
就可以了。
  1. proc sql noprint;
  2.     create table final as
  3.     select b.firmid
  4.          , b.fyear
  5.          , ifn(c.out>0, 1, 0)    as  turnover
  6.          , c.out  as resigned
复制代码

17
带发修行僧 发表于 2014-5-5 21:36:03
jeozu 发表于 2014-5-5 20:23
写代码的时候就猜到你会有这个问题,所以留了这个变量,只是没有最后显示出来。
在最后一个表格中添加一 ...
非常谢谢您!

18
带发修行僧 发表于 2014-5-5 22:27:23
jeozu 发表于 2014-5-1 02:08
我犯了一个错,忘了是在SAS里。去掉了subquery里的order by就一切正常了。
不好意思,我刚刚再次试验了您的code,发现还有一个问题没有解决。事实上在我的数据中存在年份缺失,比如firm A, 有2007和2009年的数据,但是没有2008年的数据。如果存在这样的情况那么2007年的数据需要和2009年的数据进行比较;否则的话,按照您的code跑出来的结果会显示2009年没有员工离职。能否进行相应的修改?

19
jeozu 发表于 2014-5-5 22:52:59
带发修行僧 发表于 2014-5-5 22:27
不好意思,我刚刚再次试验了您的code,发现还有一个问题没有解决。事实上在我的数据中存在年份缺失,比如 ...
这样的情况下,有两种处理方案。
1。在数据中将缺失的数据补上。(这是最推荐的方法)
2。将数据中的year不用来做key.按照year排序后,添加一个index,然后使用index 来替换year. 这样就能实现你要的功能。

20
带发修行僧 发表于 2014-5-5 23:00:11
jeozu 发表于 2014-5-5 22:52
这样的情况下,有两种处理方案。
1。在数据中将缺失的数据补上。(这是最推荐的方法)
2。将数据中的 ...
第一种方案可能无法实现,原因是我的数据来源于数据库;
您的第二种方法的index是什么意思,可以和我详细讲讲吗?谢谢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 02:58