如何在SAS中提取某些记录并更新数据?

时间:2018-04-02 15:28:08

标签: sas

我有一张顾客购买表。目标是能够为每个客户提取最近20次购买的摘要统计数据,并在每个新订单进入时更新它们。最佳方法是什么?我需要为每个客户提供一张桌子吗?请记住,有超过500个客户。感谢。

2 个答案:

答案 0 :(得分:1)

这是高级别的问题,所以我会在那个级别回答。如果您需要更详细的帮助,您需要提供更详细的信息,并尝试自己解决问题。

在SAS中,您可以在每个PROC或DATA步骤中使用BY语句,以及大多数PROC中提供的CLASS语句。这两者对于在全球范围以下的水平进行数据分析非常有用。对于许多基本用途,他们给出了类似的结果,尽管并非在所有情况下;查找您正在使用的特定PROC进行分析以获取更多详细信息。

据推测,你创建了一个表,其中包含每个客户最近20条记录,甚至一个视图(视图就像一个表,除非它没有写入磁盘),然后运行你的分析PROC {{1}您的客户ID变量。如果将其设置为视图,则甚至不必重新运行该部分 - 您可以创建指向不断更新的数据的永久视图,并且每次运行分析PROC时都会发生最后20条记录的子集。

答案 1 :(得分:0)

是的,您可以在现有表格中添加排名,也可以创建另一个包含每位客户最近20次购买的表格。

我的建议是使用数据集来选择每位客户的前20名购买者,然后进行汇总统计。我的下面的代码将创建一个名为" WANT"排名前20位和排名领域。

示例数据:

data have;
input id $ purchase_date amount;
informat purchase_date datetime19.;
format purchase_date datetime19.;
datalines;
cust01 21dec2017:12:12:30 234.57
cust01 23dec2017:12:12:30 2.88
cust01 24dec2017:12:12:30 4.99
cust02 21nov2017:12:12:30 34.5
cust02 23nov2017:12:12:30 12.6
cust02 24nov2017:12:12:30 14.01
;
run;

按ID和日期按降序排序数据:

proc sort data=have ; 
by id descending purchase_date ;
run;

选择前2:在您的情况下将我的2改为20

/*Top 2*/
%let top=2;
data want (where=(Rank ne .));
set have;
by id;
retain i;
/*reset counter for top */
if first.id then do;  i=1; end;
if i <= &top then do; Rank= &top+1-i; output; i=i+1;end;
drop i;
run;

输出:最近2次客户购买:

id=cust01 purchase_date=24DEC2017:12:12:30 amount=4.99 Rank=2 
id=cust01 purchase_date=23DEC2017:12:12:30 amount=2.88 Rank=1 
id=cust02 purchase_date=24NOV2017:12:12:30 amount=14.01 Rank=2 
id=cust02 purchase_date=23NOV2017:12:12:30 amount=12.6 Rank=1