SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

楼主: shiyiming
打印 上一主题 下一主题

练手系列3:表关联与累计值计算

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2007-11-6 18:09:15 | 只看该作者

Re: 练手系列3:表关联与累计值计算

看了各位高手的答案,都不好意思把我的拿出来了:(
我是初学,考虑再三,拿出来请大家批评指正,不得已用了一点sql;
基本思路是在A中增加变量计算tvalue,再与B合并
[code:2espumwq]data a;
infile datalines;
input name $ date:yymmdd10. value;
datalines;
A 20070101 1
A 20070102 2
A 20070103 3
A 20070104 4
A 20070105 5
A 20070106 6
A 20070107 7
B 20070101 8
B 20070102 9
;
run;
data b;
infile datalines;
input name $ sdate:yymmdd10. edate:yymmdd10.;
datalines;
A 20070102 20070106
A 20070101 20070104
B 20070101 20070102
;
run;
proc sql;
create table m1 as
select a.value as svalue, b.* from a,b where a.name=b.name and a.date=b.sdate;
proc sql;
create table m2 as
select a.value as evalue, b.* from a,b where a.name=b.name and a.date=b.edate;
quit;
data m;
merge m1 m2;
by name;
run;
data m;
merge m1 m2;
by name;
run;
proc sql noprint;
select count(name) into:num from b;quit;
%macro luijb;
%do n=1 %to #
data _null_;
set b(firstobs=&n obs=&n);
call symput('name',name);
call symput('sdate',sdate);
call symput('edate',edate);

data a;
set a;
if name="&name" and (date-&sdate) ge 0 and (&edate-date) ge 0 then tvalue&n=value;

proc means data=a noprint;
var tvalue1-tvalue&n;
output out=c sum=tvalue1-tvalue&n ;
proc transpose data=c out=c1;
var tvalue1-tvalue&n;
%end;

data c;
set c1(rename=(col1=tvalue));
keep tvalue;
run;
%mend luijb;
%luijb;
data result;
merge c m;
format sdate edate yymmdd10.;
run;
[/code:2espumwq]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2007-11-6 20:17:27 | 只看该作者

Re: 练手系列3:表关联与累计值计算

最近两天忙,没有怎么来看,原来高手都来了呀,呵呵,我也顺便学习下
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2007-12-7 21:29:16 | 只看该作者

Re: 练手系列3:表关联与累计值计算

[code:2u6senv4]data ahuige;
  set b;
  ID=_N_;
  do date=sdate to edate;
  output;
  end;
run;

proc sort data=AHUIGE;
  by name DATE;
run;

data expansion(WHERE=(NOT MISSING(ID)));
  merge a  ahuige;
  by name date;
  sval=(date=sdate)*value;
  eval=(date=edate)*value;
run;

proc sort data=expansion;
  by ID name sdate edate;
run;

DATA C(KEEP=NAME SDATE EDATE STARTVAL ENDVAL SUM);
  SET EXPANSION ;
  BY ID NAME SDATE EDATE;
  RETAIN STARTVAL ENDVAL SUM 0;
  STARTVAL=STARTVAL*(1-FIRST.NAME)+SVAL;
  ENDVAL=ENDVAL*(1-FIRST.NAME)+EVAL;
  SUM=SUM*(1-FIRST.NAME)+VALUE;
  IF LAST.NAME THEN OUTPUT;
RUN;[/code:2u6senv4]
不会HASH,也没有SAS9.................
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2007-12-25 18:52:45 | 只看该作者

Re: 练手系列3:表关联与累计值计算

data a;
infile datalines;
input name $ date:yymmdd10. value;
format date yymmdd10.;
datalines;
A 20070101 1
A 20070102 2
A 20070103 3
A 20070104 4
A 20070105 5
A 20070106 6
A 20070107 7
B 20070101 8
B 20070102 9
;
run;

data b;
infile datalines;
input name $ sdate:yymmdd10. edate:yymmdd10.;
format sdate edate yymmdd10.;
datalines;
A 20070102 20070106
A 20070101 20070104
B 20070101 20070102
;
run;
data temp1;
        retain total;
        set a;
        by name;
        if first.name then total=0;
        total=value+total;
        lagtotal=lag(total);
        if first.name then lagtotal=0;
run;

proc sort data=temp1;
        by name date;
proc sort data=b out=temp2;
        by name sdate;
run;
data temp2(rename=(value=svalue lagtotal=stotal) drop=total);
        merge temp2(in=b1) temp1(rename=(date=sdate));
        by name sdate;
        if b1;
run;
proc sort data=temp2;
        by name edate;
run;

data temp2(rename=(value=evalue) drop=lagtotal total stotal);
        merge temp2(in=b1) temp1(rename=(date=edate));
        by name edate;
        retain name sdate edate svalue value tvalue;
        if b1;
        tvalue=total-stotal;
run;

也能实现,不知道在现实环境中的速度,因为里面有对B表排序。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2007-12-26 09:31:12 | 只看该作者

Re: 练手系列3:表关联与累计值计算

这个例子如果用MERGE在实际环境中很慢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
16#
 楼主| 发表于 2008-3-27 08:34:40 | 只看该作者

Re: 练手系列3:表关联与累计值计算

[code:3gic0mzb]
data a;
        infile datalines;
        input name $ date:yymmdd10. value;
        format date yymmdd10.;
        datalines;
A 20070101 1
A 20070102 2
A 20070103 3
A 20070104 4
A 20070105 5
A 20070106 6
A 20070107 7
B 20070101 8
B 20070102 9
B 20070103 10
;
run;

data b;
        infile datalines;
        input name $ sdate:yymmdd10. edate:yymmdd10.;
        format sdate edate yymmdd10.;
        datalines;
A 20070102 20070106
A 20070101 20070104
B 20070101 20070102
A 20070101 20070104
;
run;
data c(drop=name1 value date);
        set b;
        retain tvalue 0;
        tvalue=0;
        if _n_=1 then set a nobs=n;
        do i=1 to n until(last);
                set a (rename=(name=name1)) end=last point=i;
                if name=name1 and date=sdate then svalue = value;
                if name=name1 and date>=sdate and date<=edate then tvalue+value;
                if name=name1 and date=edate then do;
                        evalue=value;
                        output;
                end;
        end;
run;
proc print data=c;
run;
[/code:3gic0mzb]
正在学习sas,看到题目忍不住写了一个程序,也能实现,不过至于效率嘛。。。。。见笑了
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
17#
 楼主| 发表于 2008-4-8 21:10:15 | 只看该作者

Re: 练手系列3:表关联与累计值计算

楼主,今天在某银行卡中心拜读了跟你名字一样的人写的sas程序啊,
不会真就是你吧,呵呵,
方便的话qq联系啊,15976493
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
18#
 楼主| 发表于 2008-4-9 13:00:18 | 只看该作者

to zhoubin

没错,那就是我。小弟不才,就是在银行里混的,呵呵呵。
我在国内绝大多数的信用卡中心工作过或者合作过,与这些卡中心的员工、系统、数据都很熟。感觉都像是我的“家”一样。
银行业圈内小有名气,至少在很多银行的IT部、市场部、风险部都有点人缘。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
19#
 楼主| 发表于 2008-6-3 10:29:13 | 只看该作者

Re: 练手系列3:表关联与累计值计算

对于小表与大表的连接,用format的方法应该效率不错,不比HASH函数慢.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
20#
 楼主| 发表于 2008-6-4 17:39:53 | 只看该作者

to bobhoo

兄弟说的很对,另外感觉hash比较危险,
因为它把数据全部装入内存中,
对于大数据集,
一旦内存不足的话,就容易失败。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 14:50 , Processed in 0.070292 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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