全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5432 9
2011-03-05
先分组,再取每组中前两条最小的纪录

表结构如下:
a        b        c
s1        d3        0
s1        d1        2
s1        d2        3


s2        d3        0
s2        d1        1
s2        d4        2

s2        d5        7
s2        d6        8

s3        d3        1
s3        d1        1
s3        d2        2
s3        d4        0.5

s3        d5        0.5
s3        d7        8
s3        d9        12

先按照字段a分组,再取每组中c字段的前两条最小的纪录,也就是说,
对s1组,应该取

s1        d3        0
s1        d1        2
因为这两条的c字段纪录值最小.


对s2组,本应该取
s2        d3        0
s2        d1        1
但是因为字段b的d3, d1已经在s1组中出现过,

所以只能取
s2        d4        2
s2        d5        7



同样对s3组,本该取
s3        d4        0.5
s3        d5        0.5
但是d1,d3,d4,d5都在前面的两组中出现了,所以只能取两个最小的c字段值.
s3        d2        2
s3        d7        8


用了下面的SQL ,
Select *
From test A
Where (Select Count(*)
           From test
           Where a = A.a And c< A.c) < 2
Order By a, c



只能实现取每组前两个最小的c纪录值.
请问如何实现b字段已经出现在其他组中就不参与分组排序的PROC SQL,

想用宏来实现出现过就删除, 但不知道大家有没有好的办法?


请高手帮忙,多谢
二维码

扫码加我 拉你入群

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

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

全部回复
2011-3-5 08:18:35
但是字段d1 也在S1组中已出现过了。
二维码

扫码加我 拉你入群

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

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

2011-3-5 09:04:41
谢谢,我再改改我的数据表.
二维码

扫码加我 拉你入群

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

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

2011-3-5 09:19:07
可以用data step

data test;
input a $ b $ c;
datalines;
s1        d3        0
s1        d1        2
s1        d2        3
s2        d3        0
s2        d1        1
s2        d4        2
s2        d5        7
s2        d6        8
s3        d3        1
s3        d1        1
s3        d2        2
s3        d4        0.5
s3        d5        0.5
s3        d7        8
s3        d9        12
;run;

proc sort data=test;
by a c;run;

data sorted(drop=bstring count);
length bstring $200.;
set test;
by a;
if first.a then count=0;
if (count<2 and index(bstring,trim(b))=0) then do;
output;
count+1;
bstring=cat(trim(left(bstring)),b);
end;
retain bstring;

proc print data=sorted;run;
二维码

扫码加我 拉你入群

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

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

2011-3-5 21:56:05
非常感谢回复!
但是如果数据量有几千万条, bstring 的长度就不够了.
The length of character var is 1-32767.
二维码

扫码加我 拉你入群

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

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

2011-3-6 09:25:37
这个如何?


data test;
input a $ b $ c;
datalines;
s1        d3        0
s1        d1        2
s1        d2        3
s2        d3        0
s2        d1        1
s2        d4        2
s2        d5        7
s2        d6        8
s3        d3        1
s3        d1        1
s3        d2        2
s3        d4        0.5
s3        d5        0.5
s3        d7        8
s3        d9        12
;run;

proc sort data=test out=testgp;
by a c;

data testgp;
set testgp;
by a;
if first.a then group+1;
call symput("ngroup", group);
run;

%macro getmin2;
data new;
set testgp;
if group=1;

data min2;
set new(obs=2);
run;

%do i=2 %to &ngroup;
proc sql;
create table new as
select * from testgp where group=&i and b not in (select b from min2);

data min2;
set min2 new(obs=2);
run;
%end;
%mend;
%getmin2;

proc print data=min2;run;

5# lachance
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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