在这里为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
答案 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;