SAS中仅一列的最后3小时记录的滚动总和

时间:2017-11-24 13:28:51

标签: sql sas datastep

每个人, 我需要的是计算用户和ID_option分组的最后3小时使用总和(用法是数据集中的一列)的每条记录(每行)。 每行(行)代表一条记录(一小时有大约百万条记录)。例如,我创建了一个只包含几条记录的表(包括所需的列sum_usage_3 hour):

User  ID_option          time             usage        sum_usage_3hr
1         a1        12OCT2017:11:20:32       3             10
1         a1        12OCT2017:10:23:24       7             14
1         b1        12OCT2017:09:34:55       12            12
2         b1        12OCT2017:08:55:06       4              6
1         a1        12OCT2017:07:59:53       7              7
2         b1        12OCT2017:06:59:12       2              2

我尝试过类似下面这个代码的东西,并且它返回了我所有时间的总和,而不仅仅是最后3个小时。我并不感到惊讶,但我不知道我将如何在SAS中做到这一点。

proc sql:
CREATE table my_table
SELECT *, SUM(usage) AS sum_usage_3hr
FROM prev_table WHERE time BETWEEN TIME and intnx('second', time, -3*3600)
GROUP BY User, ID_option;
RUN;

欢迎任何帮助,谢谢。没有必要在proc sql中执行此操作,如果可能,数据步骤也是可以接受的。我只是假设我需要某种分区。

提前致谢。

1 个答案:

答案 0 :(得分:2)

为什么不使用相关的子查询来获得总和?

data have ;
  input user id_option $ datetime :datetime. usage expected ;
  format datetime datetime20.;
cards;
1 a1 12OCT2017:11:20:32  3  10
1 a1 12OCT2017:10:23:24  7  14
1 b1 12OCT2017:09:34:55 12  12
2 b1 12OCT2017:08:55:06  4   6
1 a1 12OCT2017:07:59:53  7   7
2 b1 12OCT2017:06:59:12  2   2
;
proc print; run;

proc sql ;
create table want as
  select a.*
       , (select sum(b.usage) 
          from have b
          where a.user=b.user and a.id_option=b.id_option
            and b.datetime between intnx('hour',a.datetime,-3,'s') and a.datetime
         ) as usage_3hr 
  from have a
;
quit;

结果

                                                                         usage_
Obs    user    id_option                datetime    usage    expected      3hr

 1       1        a1          12OCT2017:11:20:32       3        10         10
 2       1        a1          12OCT2017:10:23:24       7        14         14
 3       1        b1          12OCT2017:09:34:55      12        12         12
 4       2        b1          12OCT2017:08:55:06       4         6          6
 5       1        a1          12OCT2017:07:59:53       7         7          7
 6       2        b1          12OCT2017:06:59:12       2         2          2