SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1721|回复: 4
打印 上一主题 下一主题

求助如何在sas中实现row_number功能

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-5-26 13:18:57 | 只看该作者

求助如何在sas中实现row_number功能

数据库中的row_number语句不能再sas中应用。
例如:
proc sql;
select
id
,row_number() over(partition by id order by x desc)
from maps.world
;
quit;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-5-26 17:17:11 | 只看该作者

Re: 求助如何在sas中实现row_number功能

功能是什么啊?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-5-26 21:07:15 | 只看该作者

Re: 求助如何在sas中实现row_number功能

Ahuige mentioned a SAS SQL function of [b:2pnmzhpm]MONOTONIC( )[/b:2pnmzhpm], giving the row number of the table. I find this function is sort of bizarre. Honestly, i have never come with a good example on my own.
Jingju
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-5-27 13:07:54 | 只看该作者

Re: 求助如何在sas中实现row_number功能

例如:
proc sql;
create table test.tmp_test
(
user_id char(10)
,update_time char(15)
);
insert into test.tmp_test values('asia2011','20110529');
insert into test.tmp_test values('asia2011','20110528');
insert into test.tmp_test values('asia2011','20110527');
insert into test.tmp_test values('link2011','20110529');
insert into test.tmp_test values('link2011','20110528');
insert into test.tmp_test values('link2011','20110527');
run;
proc sql;
select
user_id
,update_time
,row_number() over(partition by user_id ,ordre by update_time)
from test.tmp_test
;
quit;

返回的结果应该是:
'asia2011'    '20110529'  1
'asia2011'    '20110529'  2
'asia2011'    '20110529'  3
'link2011'    '20110529'  1
'link2011'    '20110529'  2
'link2011'    '20110529'  3

但是系统中没有这个函数,不知道sas里面有没有类似的函数可以直接实现或者间接实现也行。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-5-30 16:45:12 | 只看该作者

Re: 求助如何在sas中实现row_number功能

经过几天的研究,已经解决。如下:
/*在进行rank排序之前,必须对表进行排序,除非此表已经做过排序*/
proc sort data=test.dw_user_20110422;
by user_id;
run;

/*虽然已经排序,但是一模一样的两条数据排序一样。如果想唯一,就只有max一下字段了。*/
proc rank data=test.dw_user_20110422 out=test.dw_user_20110421 ties=low;
        by user_id;
    var long;
    ranks user_id_m;
run;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 05:49 , Processed in 0.068724 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表