2016-08-24 57 views
-1

这里完成新手到SAS。继承了我负责用SQL重新设计的一段代码。重新构建SAS代码

通过代码,并遇到这两个块扔了我。希望这里的某个人能够帮助我解释这一点,或者指出我的解释是否正确?

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; 

什么总和=;意思? var count在哪里使用?如果没有提供总和列,它究竟是在这里聚合?

任何帮助将不胜感激。

感谢, KV

回答

1

看起来像它的换挡一天到一周结束(因此,通过聚集一切一周)。奇怪的做法,可能它早于intnx()/intck()week()

sum=意味着总和无论是var名单上,保存在相同的变量名的总和(所以sum(count)=count将是同样的事情)。通过忽略=左侧的变量列表,它意味着每个变量,并且通过省略待命名列表意味着保持名称相同。

因此,基本上,每个col1/col2分组按每周总和count

+0

感谢您对总和= – Bee

+0

解释@ user6754080你可能想看看在support.sas.com上的SAS文档,它可能会有所帮助。 –

+0

@data_null_谢谢。是的,我正在阅读文档 - 这是我如何理解很多代码。我得到的总和=我无法找到信息,以及我认识到的某些日期转换是特定于此程序的。 – Bee

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个星期,然后返回星期间隔的开始日期或星期间隔的结束日期。我们定义我们的星期从星期一开始,使用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; 
+0

太好了。非常感谢。 – Bee

+1

Rob,很好的答案,但是我们实际上不应该在Stack Overflow上做的一件事是直接进行代码转换(否则这最终会导致像这样的无尽请求)。 – Joe

+0

@Joe嗯,是的,当我写回答时,我完全忘记了。我想知道如果它在同一种语言中是否还被认为是代码转换?可能是的,因为我们不需要一大堆数据步骤 - > sql问题,反之亦然......我想写一个类似于你的解释,并且认为在给定的情况下,它几乎是一个1- proc means“和”proc sql“之间的关键字to-1映射,因此只需将语句转换为sql即可轻松传达它的工作方式。 –