重新架构SAS代码

时间:2016-08-24 19:26:37

标签: sas

在这里为SAS完成新手。继承了一段代码,我的任务是在SQL中重新构建。

通过代码并遇到了这两个让我失望的街区。希望有人能帮助我解释这一点,或者指出我的解释是否正确?

 data A1;
 set temp2;
 newdate = datepart(saledate); -- Get day from saledate
 d1  = weekday(newdate);      --get weekday from the date part of saledate
 if d1 = 1 then d1 = 8;       --why is this?
 enddate = newdate + (8-d1)   --So enddate = newdate if its the first day of the week? Some kind of a date-difference here?
 format enddate date7.;       --what format is this? how does this output come out?

然后我假设这个块正在进行某种聚合:

  proc means data=A1 nway print;
  class col1 col2 enddate;
  var count;
  output out=A2(drop=_type_ _freq_)sum=;
  run;

sum =;意思? var使用在哪里?如果没有为sum提供列,那么它在这里汇总到底是什么?

非常感谢任何帮助。

谢谢, KV

2 个答案:

答案 0 :(得分:1)

看起来它正在将这一天转移到一周结束(因此,按周汇总所有内容)。奇怪的是,这可能早于intnx() / intck()week()

sum=表示对var列表中的任何内容求和,并将总和保存在相同的变量名中(因此sum(count)=count将是相同的事情)。通过省略=左边的变量列表,它意味着每个变量,并且通过省略要命名的列表意味着保持名称相同。

基本上,对于每个col1 / col2分组,这总计每周count

答案 1 :(得分:1)

我已稍微修改了代码,以便我们可以看到它在过去30天内生成的结果:

测试代码:

data _null_;
  do newdate = date() -30 to date();
    d1  = weekday(newdate);      
    if d1 = 1 then d1 = 8;       
    enddate = newdate + (8-d1)   ;
    format newdate enddate date7.;       
    put newdate= d1= enddate=;
  end;
run;

<强>输出

newdate=25JUL16 d1=2 enddate=31JUL16
newdate=26JUL16 d1=3 enddate=31JUL16
newdate=27JUL16 d1=4 enddate=31JUL16
newdate=28JUL16 d1=5 enddate=31JUL16
newdate=29JUL16 d1=6 enddate=31JUL16
newdate=30JUL16 d1=7 enddate=31JUL16
newdate=31JUL16 d1=8 enddate=31JUL16
newdate=01AUG16 d1=2 enddate=07AUG16
newdate=02AUG16 d1=3 enddate=07AUG16
newdate=03AUG16 d1=4 enddate=07AUG16
newdate=04AUG16 d1=5 enddate=07AUG16
newdate=05AUG16 d1=6 enddate=07AUG16
newdate=06AUG16 d1=7 enddate=07AUG16
newdate=07AUG16 d1=8 enddate=07AUG16
newdate=08AUG16 d1=2 enddate=14AUG16

所以我们可以看到数学基本上计算给定日期的周末,假设周数从周一开始并在周日结束。好消息是有一种更简单的方法可以使用intnx()函数和移位间隔来计算它。此方法也可以在SQL语句中使用。

<强>更好的:

data _null_;
  do newdate = date() -30 to date();
    week_start = intnx('week.2', newdate, 0, 'beginning');
    week_end   = intnx('week.2', newdate, 0, 'end');
    format week_start week_end date7.;       
    put week_start= week_end=;
  end;
run;

上述代码在过去30天内循环播放。对于每个日期,它会将0周添加到日期,然后返回周间隔的开始日期或周间隔的结束日期。我们将周定义为周一开始使用a&#39; shift&#39; 2(即week.2表示,周数从星期一开始,而不是默认星期日)。

<强>输出:

week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=01AUG16 week_end=07AUG16

proc means代码基本上转换为SQL中的以下内容:

proc sql noprint;
  create table a2 as 
  select col1, col2, enddate, sum(count) as count
  from a1
  group by 1,2,3
  ;
quit;