全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1082 5
2024-10-31
悬赏 1000 个论坛币 未解决
有一个需求求助一下,原始数据是这样的,包含了姓名,购买的时间和购买金额三个指标,如果同一个人有多次购买记录,那么新的购买记录会在下一行,并且姓名信息是省略了的,现在要求只用1个data步,读取数据,并且只保留最后一次的购买日期,同时把所有的消费金额加总,计算2023/12/31距离最后一次购买日期的时间差,数据的样式和输出结果样式我放下面,这个怎么用1个data步就实现出来,恳请大神帮忙。

输入数据的格式
12345678901234567890123456789012345678901234567890
"Lang Yu" 1/Aug/2023 100
"Tian Hui" 15/Sep/2023 200
      10/Sep/2023 400
"Bai Yun"  3/Jun/2023 150
  20/Jul/2023 200
1/Dec/2023 230
15/Oct/2023 160

SAS导出的格式
Name     Last Date   Num   Total     Days to 31/Dec/2023
Lang Yu      23223         1     100                                152
Bai Yun       23268         2     600                                107
Bai Yun       23345         4     740                                  30

二维码

扫码加我 拉你入群

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

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

全部回复
2024-11-5 15:35:32
data raw0;
retain name lastdate num total  days;

input name0 $1-11 Date$12-23  Cost ;
date0=input(upcase(compress(date,'/')),date9.);

retain name num total lastdate;
if ^missing(name0) then do;
  name=name0;
  num=_n_;
  total=cost;
  lastdate=date0;
end;
else if missing(name0) then do;
  name0=name;
  num=num;
  total=total+cost;
  if date0>lastdate then lastdate=date0;
  else date0=lastdate;
end;
name=compress(name,'"');
days='31DEC2023'd-lastdate;

keep name lastdate num total  days;
cards;
"Lang Yu"  1/Aug/2023  100
"Tian Hui" 15/Sep/2023 200
           10/Sep/2023 400
"Bai Yun"  3/Jun/2023  150
           20/Jul/2023 200
           1/Dec/2023  230
           15/Oct/2023 160
;
proc sort;by num descending lastdate descending total;
proc sort nodupkey;by num;
run;
二维码

扫码加我 拉你入群

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

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

2024-11-5 15:46:37
ovette 发表于 2024-11-5 15:35
data raw0;
retain name lastdate num total  days;
input语句 其中name0 和date都是字符型,要加美元符号,不知道为什么平台没有显示出
二维码

扫码加我 拉你入群

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

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

2024-12-13 15:24:22
解读一下一楼的逻辑,是合理的,通过retain语句,
第一步先补齐name, retain name1;if name ne "" then name1=name;这样全部记录有名字的信息了。
第二步计算累加金额,也可以通过retain 语句, retain sum; if name ne "" then sum=income per day; else sum=sum+income per day;这样得到了每个人的总和。
第三步计算2023/12/31距离最后一次购买日期的时间差,先全部的日期中得到最大的 retain date1 ; if date1<date(数值型的) then date1=date;
然后计算时间差day="2023-12-31"dt-date; 得到了最后的时间点和2023-12-31的之间的天数。
为了乱序最后可以加个ord=_n_; 这样sort by name1 ord就方便只output每个人的最后一条。


二维码

扫码加我 拉你入群

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

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

2024-12-18 17:39:28
两个数据步:
复制代码


二维码

扫码加我 拉你入群

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

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

2025-2-8 10:24:37
ovette 发表于 2024-11-5 15:35
data raw0;
retain name lastdate num total  days;
能否帮忙解决一下这个数据处理问题?  https://bbs.pinggu.org/thread-13985353-1-1.html 谢谢。
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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