楼主: ashleyle
3615 3

sas最大值的程序求教~涉及到时间 [推广有奖]

  • 0关注
  • 0粉丝

高中生

5%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
8245 点
帖子
6
精华
0
在线时间
38 小时
注册时间
2016-4-7
最后登录
2021-9-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教大神们~我想了很久也没有特别好的实施方法,现在需要批量处理数据
不同时间段有不同的金额,想知道客户在此时间段内,业务最大叠加的金额是多少。最大金额可能出现在时间轴的任何一点,不要求知道时间,只要求得出金额。
表格形式如下
客户号  开始日期          结束日期       金额
123      2011-03-01    2012-06-04     80000
123      2012-01-02    2013-03-03     100000
123      2014-05-05    2015-05-05     200000
123      2013-01-01    2015-03-20     80000
456      2012-01-01    2016-01-01     700000
456      2012-06-08    2016-01-01     80000
456      2013-01-01    2016-01-01     10000
456      2015-06-01    2016-01-01     20000
如客户123最大金额为28万,出现在14-05-05到15-03-20之间
客户456最大金额为711万,出现在2015年06-01到2016-01-01之间
客户最多有50多笔业务~
多谢~


二维码

扫码加我 拉你入群

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

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

关键词:最大值 批量处理 表格形式 处理数据 实施方法 最大值 时间段 程序

沙发
zqy458219593 发表于 2016-5-24 15:52:07 |只看作者 |坛友微信交流群
我理解意思是, 以客户为分租,求连续时间段内 客户消费最大额。
主要使用sas中retain函数,下次你碰到这种问题,第一时间往这个方向想就ok了。
1.时间连续:累加
2.时间断裂:重置---继续累加
3.求最大值

参见代码,可以拿去试一下


  1. data a;
  2.         input id start yymmdd12. endd yymmdd10.  count;
  3.         format start yymmdd10.  endd yymmdd10.;
  4.         datalines;
  5. 123 2011-03-01  2012-06-04 80000
  6. 123 2012-01-02  2013-03-03 100000
  7. 123 2014-05-05  2015-05-05 200000
  8. 123 2013-01-01  2015-03-20 80000
  9. 456 2012-01-01  2016-01-01 700000
  10. 456 2012-06-08  2016-01-01 80000
  11. 456 2013-01-01  2016-01-01 10000
  12. 456 2015-06-01  2016-01-01 20000
  13. ;
  14. run;

  15. data b;
  16.         set a;
  17.         by id;
  18.         retain date sum;
  19.         if first.id then do;
  20.                 date=endd;
  21.                 sum=count;
  22.         end;
  23.         else
  24.         do;
  25.                 if date ge start then
  26.                 do;
  27.                         date=endd;
  28.                         sum=sum(sum,count);
  29.                 end;
  30.                 else
  31.                 do;
  32.                         date=endd;
  33.                         sum=count;
  34.                 end;       
  35.         end;
  36. run;
  37. proc sql;
  38.         create table d as
  39.         select id,start,endd,max(sum) as msum
  40.         from b
  41.         group by id;
  42. quit;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
冯枫Fery + 1 + 1 + 1 精彩帖子
admin_kefu + 50 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 50  学术水平 + 3  热心指数 + 3  信用等级 + 1   查看全部评分

使用道具

藤椅
ashleyle 发表于 2016-5-25 22:42:33 |只看作者 |坛友微信交流群
zqy458219593 发表于 2016-5-24 15:52
我理解意思是, 以客户为分租,求连续时间段内 客户消费最大额。
主要使用sas中retain函数,下次你碰到这种 ...
蟹蟹

时间段可能是断层的,可能有一年或者有几个月客人没有任何金额的交易。
要得出所有客人近5年内业务的最大累积金额。

我后来自己也想了一个方法,不过比较笨
proc sql;
create table a1 as
select cus_id, start_date as date
from a.original;
quit;

proc sql;
create table a2 as
select cus_id, end_date as date
from a.original;
quit;

proc sort data=a1;
by cus_id date;
run;

proc sort data=a2;
by cus_id date;
run;

data merge;
merge a1 a2
by cus_id;
run;

proc sql;
create table a3 as
select *
from merge cross join a.original as a
by merge.id=a.id;
quit;

data a4;
set a3;
if date ge start_date
and date lt end_date
then flag=1;
run;

proc sql;
create table a5 as
select *,
        sum(amount) as amount_sum
from a4
group by cus_id loan_date flag;
quit;

data a6;
set a5;
if flag=""
then amount_sum=loan_amount;
run;

proc sql;
select cus_id, max(amount_sum) as max
from a6;
quit;


不过你的代码更简洁高效~

使用道具

板凳
zqy458219593 发表于 2016-5-26 09:39:41 |只看作者 |坛友微信交流群
ashleyle 发表于 2016-5-25 22:42
蟹蟹

时间段可能是断层的,可能有一年或者有几个月客人没有任何金额的交易。
你的方法也是可以的。只不过逻辑比较直接,而且你使用了多步语句,其中的左联语句在数据量庞大(PB级)的情况下,速度将会非常的慢。而且你这份是消费数据,频次应该是很高的。建议去sas help看看retain函数和LAG函数。

使用道具

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

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

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

GMT+8, 2024-5-1 12:20