我希望按产品的当前日期除以前日期的值之和。下面给出的是数据集。在输出表中,我已经提到了我之前日期的值的总和应该如何。
对于Eg:对于2014年7月27日的日期,我想要按产品级别除当前日期之外的先前日期的总和。同样,当您获取2014年7月20日的总和时,请忽略2014年7月20日以及2014年7月27日的值,并取消之前的其余日期。 这里也有一个例外。当您看到例如7/20/2014和6/8/2014的重复项时,只考虑一个值。
DATE DEALID PRODUCT VALUE
7/27/2014 6575 CLIENT 4
7/20/2014 16701 CLIENT 6
7/20/2014 16701 CLIENT 6
7/13/2014 6601 CLIENT 4
7/6/2014 10871 SERVICES 5
6/29/2014 16661 SERVICES 2
6/22/2014 66757 SERVICES 1
6/15/2014 77757 SERVICES 5
6/8/2014 5675 SERVICES 8
6/8/2014 5675 SERVICES 8
5/25/2014 5756 SERVICES 4
输出表
DATE DEALID PRODUCT VALUE SUMM
7/27/2014 6575 CLIENT 4 10
7/20/2014 16701 CLIENT 6 4
7/20/2014 16701 CLIENT 6 4
7/13/2014 6601 CLIENT 4 0
7/6/2014 10871 SERVICES 5 20
6/29/2014 16661 SERVICES 2 18
6/22/2014 66757 SERVICES 1 17
6/15/2014 77757 SERVICES 5 12
6/8/2014 5675 SERVICES 8 4
6/8/2014 5675 SERVICES 8 4
5/25/2014 5756 SERVICES 4 0
答案 0 :(得分:2)
普通的旧SAS数据步骤通常更加实用,并且通常可以针对非常具体的要求运行得更快。
让我们像NEO_mental一样开始创建数据
data test;
infile datalines;
format date mmddyy10.; /** Make SAS print dates as a date instead of numbers **/
input date : mmddyy10.
Dealid : $ 8.
PRODUCT : $10.
Value : 8.
;
datalines;
7/27/2014 6575 CLIENT 4
7/20/2014 16701 CLIENT 6
7/20/2014 16701 CLIENT 6
7/13/2014 6601 CLIENT 4
7/6/2014 10871 SERVICES 5
6/29/2014 16661 SERVICES 2
6/22/2014 66757 SERVICES 1
6/15/2014 77757 SERVICES 5
6/8/2014 5675 SERVICES 8
6/8/2014 5675 SERVICES 8
5/25/2014 5756 SERVICES 4
;
run;
要计算运行总计,我按升序排序。 我不会删除重复项,因为我在数据步骤中处理它们。
proc sort data=test out=ascendingTest;
by Product Date;
run;
这是一个很好的旧数据步骤,我在其中进行所有计算
/** Create a dataset including the running total **/
Data summTest;
/** Read in the data **/
set ascendingTest;
/** Enable things like first.Product and last.Date **/
by Product Date;
/** Create the running total **/
/** variables are initialised for each observation (=row) unless you retain them **/
retain Summ;
if first.Product then Summ = 0; /** Start over for each product **/
/** Write out the result BEFORE increasing the total **/
output;
/** Increase the running total for the later dates **/
if last.Date then Summ = Summ + Value;
run;
因为我们没有删除重复项,所以我不需要合并,因此我所要做的就是按降序日期排序。 注意:如果性能有问题,请写入'Data summTest / view = summTest。这样,数据步骤将不会读取任何数据,并且只有在排序步骤消耗结果时才会进行计算。 ;
proc sort data=summTest out=final;
by Product descending Date ;
run;
答案 1 :(得分:0)
好吧,我不知道这是不是最好的方法。
运行proc sql以获取不同的日期并将它们存储到date1 - dateN等变量中。 另一个proc sql用于计算不同的日期并将数量存储到名为count或其他的变量中。
然后创建一个空表,其列与原始列和sum列相同,循环执行日期,对表日期所在的所有值进行求和<比循环中的日期,最后将结果插入空表。
如果日期太多,您也可以使用表而不是date1-dateN变量。
答案 2 :(得分:0)
这是可重现的代码
使用Datalines读取数据集
data test;
infile datalines;
input date : mmddyy10.
Dealid : $ 8.
PRODUCT : $10.
Value : 8.
;
datalines;
7/27/2014 6575 CLIENT 4
7/20/2014 16701 CLIENT 6
7/20/2014 16701 CLIENT 6
7/13/2014 6601 CLIENT 4
7/6/2014 10871 SERVICES 5
6/29/2014 16661 SERVICES 2
6/22/2014 66757 SERVICES 1
6/15/2014 77757 SERVICES 5
6/8/2014 5675 SERVICES 8
6/8/2014 5675 SERVICES 8
5/25/2014 5756 SERVICES 4
;
run;
从每个产品中删除重复日期
proc sort data=test nodupkey out=test1;
by PRODUCT date;
run;
总结基于产品的价值数据集(注意事项)
proc summary data=test1 nway;
class PRODUCT;
var Value;
output out=test2(drop = _type_ _freq_)
sum(Value)=Value_summ;
run;
排序并合并回原始数据集并进行进一步计算
proc sort data=test;
by PRODUCT;
run;
proc sort data=test2;
by PRODUCT;
run;
data FINAL(drop=date_lag product_lag);
retain SUMM;
format date mmddyy10.;
merge test(in=a) test2(in=b);
by PRODUCT;
date_lag=lag(date);
product_lag=lag(product);
if date ne date_lag or product ne product_lag then SUMM=SUMM-value;
run;