SAS中先前日期值的总和

时间:2014-12-23 16:08:39

标签: sas

我希望按产品的当前日期除以前日期的值之和。下面给出的是数据集。在输出表中,我已经提到了我之前日期的值的总和应该如何。

对于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

3 个答案:

答案 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;
  • 使用滞后来检查日期是否有重复
  • 检查滞后日期,如果它们相同,那么SUMM将保留之前的值但是为了避免在连续记录中的两个不同产品中日期相同的情况,有“OR”条件将检查以前的PRODUCT记录是否不同,如果它会那么它会变成减法,希望有意义

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;