请选择 进入手机版 | 继续访问电脑版
楼主: tj0412ymy
13961 26

[原创博文] 三种方法解决分组排序编号问题(2种SQL+1种DATA STEP) [推广有奖]

  • 2关注
  • 48粉丝

副教授

65%

还不是VIP/贵宾

-

威望
0
论坛币
11490 个
通用积分
12.6225
学术水平
72 点
热心指数
91 点
信用等级
64 点
经验
29292 点
帖子
545
精华
0
在线时间
1203 小时
注册时间
2009-3-10
最后登录
2024-2-15

tj0412ymy 发表于 2011-11-22 09:32:13 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近看到很多疑难解惑的帖子(如:https://bbs.pinggu.org/thread-1255645-1-1.html)都在讨论分组排序的问题,包括如何分别在DATA步和SQL中实现这一功能?对此,特做一总结,共同分享!欢迎讨论!
Q: 原始数据集如下:

Obs

var1

var2

1

A

z

2

A

y

3

A

x

4

A

t

5

B

s

6

B

d

7

C

f

8

C

g

9

C

h


A:想要得到一个分组排序的编号的变量flag, 期望的数据集如下:

Obs

var1

var2

flag

1

A

t

1

2

A

x

2

3

A

y

3

4

A

z

4

5

B

d

1

6

B

s

2

7

C

f

1

8

C

g

2

9

C

h

3


DATA步实现(简单快捷):
  1. data test;
  2. input var1 $ var2 $;
  3. cards;
  4. A z
  5. A y
  6. A x
  7. A t
  8. B s
  9. B d
  10. C f
  11. C g
  12. C h
  13. ;
  14. run;
  15. proc sort data=test;by var1 var2;run;
  16. data final;
  17. set test;
  18. by var1;
  19. if first.var1 then flag=1;
  20. else flag+1;
  21. run;
  22. proc print;run;
复制代码
SQL实现1(借用monotonic() 函数):
  1. proc sql;
  2. create table test as
  3. select * from test order by var1,var2
  4. ;
  5. create table final as
  6. select a.var1,a.var2,(a.num-b.diff) as flag
  7. from
  8. (select var1,var2,monotonic() as num
  9. from test) as a,
  10. (select var1,var2,monotonic() as num,count(*) as obs,(calculated num-calculated obs) as diff
  11. from test
  12. group by var1
  13. having max(num)=num) as b
  14. where a.var1=b.var1
  15. ;
  16. quit;
  17. proc print;run;
复制代码

SQL实现2(增加一个temp变量,借助该变量实现):

  1. data test;
  2. input var1 $ var2 $ temp;
  3. cards;
  4. A z 1
  5. A y 1
  6. A x 1
  7. A t 1
  8. B s 1
  9. B d 1
  10. C f 1
  11. C g 1
  12. C h 1
  13. ;
  14. run;
  15. proc sort data=test;by var1 var2;
  16. run;
  17. proc sql noprint;
  18. create table final as
  19. select A.var1,A.var2,SUM (B.temp) as flag
  20. from test as A inner join test as B ON A.var1 = B.var1
  21. where B.var2 <= A.var2
  22. group by A.var1,A.var2 ;
  23. quit;
复制代码
二维码

扫码加我 拉你入群

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

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

关键词:Data step Step Data sql inner join 如何

已有 4 人评分学术水平 热心指数 信用等级 收起 理由
eijuhz + 2 精彩帖子
Tigflanker + 1 + 1 + 1 观点有启发
zhentao + 1 + 1 + 1 不错。支持这种原创。
yugao1986 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 5  热心指数 + 3  信用等级 + 3   查看全部评分

本帖被以下文库推荐

Davidhust 发表于 2011-11-22 09:40:34 |显示全部楼层 |坛友微信交流群
技术贴,顶起

使用道具

dcyhfut 发表于 2011-12-20 19:52:24 |显示全部楼层 |坛友微信交流群
真牛

使用道具

goodcircle 发表于 2012-1-11 11:01:29 |显示全部楼层 |坛友微信交流群
顶起,刚好缺这个~

使用道具

mymine 发表于 2012-1-11 15:53:25 |显示全部楼层 |坛友微信交流群
以前遇到这个问题
还不熟悉first、last的用法
用lag写了一段也实现了这个结果

data final;
set test;
no=1;
if Var1=lag(Var1) then do;
sno+no;
end;
else sno=1;
run;

使用道具

zs694461601 发表于 2012-2-20 21:09:08 |显示全部楼层 |坛友微信交流群
{:soso_e100:}{:soso_e100:}
只有艺术和科学能提高人,直到神圣的高度
http://blog.csdn.net/QUANT_zhang

使用道具

madkoala 发表于 2012-3-10 17:09:44 |显示全部楼层 |坛友微信交流群
多谢楼主总结!!这样就可以把之前看过比较零碎的东西整合起来了

使用道具

ntsean 发表于 2012-3-11 08:27:30 |显示全部楼层 |坛友微信交流群
这个如何?


proc sql;
  select distinct a.var1,a.var2, count(*) as flag
  from test a, test b
  where a.var1=b.var1 and a.var2>=b.var2
  group by a.var1,a.var2
;
quit;

使用道具

denver 发表于 2012-3-25 10:18:18 |显示全部楼层 |坛友微信交流群
ntsean 发表于 2012-3-11 08:27
这个如何?
这个程序只适用于VAR2可以排序的情况下吧,所以缺乏通用性
Denver大家一起读Paper系列索引贴:
https://bbs.pinggu.org/thread-1430892-1-1.html

使用道具

myp655 发表于 2012-3-25 17:45:12 |显示全部楼层 |坛友微信交流群
高手啊

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 00:54