2016-08-24 56 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即可輕鬆傳達它的工作方式。 –