2016-12-15 73 views
0

我想針對涉及基於多個條件的計數器的SAS問題尋求幫助。根據多個條件在SAS中添加計數器

我有一個數據集,其中包含銷售人員的客戶訪問。但是,數據集是按訪問期間執行的任務組織的,因此它可以包含多次訪問相同的條目。訪問本身可以跨越幾天。目前,數據集按照通用ID進行排序。

請還發現這裏的數據集的截圖:Data extract

我需要引入一個計數器明確標識屬於同一訪問的條目。該計數器應根據以下條件

爲每一位新員工的客戶組合
  • 新的訪問計數器。
  • 只有當日期的以下條件不成立時,才允許同一員工 - 客戶組合的新訪問計數器:1)條目來自相鄰的日子,並且2)一個條目沒有「嵌入」正在進行的訪問的條目

StartDate和EndDate在這個意義上定義了一個時間範圍,這對於相應條目的分類很重要。

這是數據集(包括預期的溶液和評論爲每個條目,可能有助於闡明上述條件):

ID的StartDate結束日期爲employeeno CustomerNo擬解決的評論 1 2009年1月6日07.01.2009 1 5 1相鄰日期 2 07.01.2009 08.01.2009 1 5 1相鄰日期 3 08.01.2009 08.01.2009 1 5 1相鄰日期 4 05.01.2009 06.01.2009 2 7 2相鄰日期 5 06.01.2009 07.01.2009 2 7 2相鄰日期 6 05.01.2009 09.01.2009 3 1 3嵌入式條目 7 08.01.2009 08.01.2009 3 1 3嵌入式條目 8 09.01.2009 13.01.2009 4 2 4相鄰日期 9 13.01.2009 13.01.2009 4 2 4相鄰日期 10 05.01.2009 13.01.2009 5 3 5 - 11 19.01.2009 23.01.2009 6 3 6單獨,因爲不同員工 12 05.01.2009 16.01.2009 6 3 7同一員工和客戶,但沒有相鄰日期 13 02.02.2009 03.02.2009 7 8 8相鄰日期 14 03.02.2009 04.02.2009 7 8 8相鄰日期 15 22.09.2010 22.09.2010 8 4 9 - 16 22.09.2010 22.09.2010 8 4 9 - 17 21.09.2010 21.09.2010 9 1 10相鄰日期 18 21.09.2010 24.09.2010 9 1 10相鄰日期 19 12.01.2009 22.01.2009 10 6 11相鄰日期 20 23.01.2009 23.01.2009 10 6 11相鄰日期s 21 12.01.2009 19.01.2009 10 6 11嵌入式登錄 22 26.01.2009 26.01.2009 2 9 12當天 23 26.01.2009 26.01.2009 2 9 12當天 24 26.01.2009 26.01.2009 2 9 12當天 25 07.05.2012 07.05.2012 1 2 13 - 26 09.05.2012 09.05.2012 1 2 14另外,由於沒有相鄰日子 27 09.07.2013 09.07.2013 3 10 15相鄰日子 28 10.07.2013 11.07.2013 3 10 15相鄰日期 29 08.09.2014 08.09.2014 4 1 16相鄰日期 30 09.09.2014 10.09.2014 4 1 16相鄰日期 31 08.09。2014 08.09.2014 4 1 16相鄰日期 32 15.09.2014 15.09.2014 4 1 17另外,由於沒有相鄰日期 33 05.09.2014 05.09.2014 5 7 18相鄰日期 34 04.09.2014 05.09.2014 5 7 18相鄰日子 35 01.06.2015 01.06.2015 7 4 19獨立櫃臺,因爲沒有相鄰的日子 36 03.06.2015 03.06.2015 7 4 20獨立櫃臺,因爲沒有相鄰的日子 37 2015年6月6日2015年6月12日7 4 21相鄰日子 38 09.06.2015 10.06.2015 7 4 21相鄰日子 39 09.06.2015 09.06.2015 10 4 22另外,由於不同的僱員但相鄰日子 40 11.06.2015 12.06.2015 10 4 22另外,由於不同的僱員但相鄰的日子 41 10.06.2015 10.06.2015 10 4 22另外,由於不同的員工bu t相鄰日子

開始之前我已經按照EmployeeNo,CustomerNo,StartDate和EndDate對我的數據集進行了排序。然後,我嘗試使用多個SET/BY和First.Variable組合,這使我能夠正確實施員工 - 客戶條件。但是,我與日期條件鬥爭。

這是我的代碼的當前狀態。

Data Count_Visits; 
    Set Data; 
    BY EmployeeNo CustomerNo; 

    Retain Counter; 

    IF First.EmployeeNo THEN Counter +1; 
    ELSE IF First.CustomerNo THEN Counter +1; 

    Keep ID StartDate EndDate EmployeeNo 
     CustomerNo Counter; 
Run; 

任何意見是非常感謝。

問候, 馬貝

+0

請發佈您到目前爲止嘗試過的代碼。將您的示例輸入和輸出數據作爲文本發佈到問題中,而不是圖像。 – user667489

+0

將數據包含爲文本,而不是圖像。如果有人想嘗試他們測試的解決方案,他們需要手動輸入數據。 – Reeza

+0

感謝您的建議,只是編輯我的帖子。 – mabe

回答

1

我相信,我想出了一個解決方案自己。可能它有點暴躁,但它似乎適用於超過30萬條條目。

Data Count_Visits; 
    Set Data; 
    BY EmployeeNo CustomerNo StartDate Enddate; 
    lag_Start = lag(StartDate); 
    lag_End = lag(EndDate); 
    lag_End1 = lag(EndDate)+1; 

    lag2_End1 = lag2(EndDate)+1; 
    lag2_Techn = lag2(TechnNo); 
    lag2_Cust = lag2(CustNo); 

    lag3_End1 = lag3(EndDate)+1; 
    lag3_Techn = lag3(TechnNo); 
    lag3_Cust = lag3(CustNo); 

    lag4_End1 = lag4(EndDate)+1; 
    lag4_Techn = lag4(TechnNo); 
    lag4_Cust = lag4(CustNo); 

    lag5_End1 = lag5(EndDate)+1; 
    lag5_Techn = lag5(TechnNo); 
    lag5_Cust = lag5(CustNo); 

    Retain Counter; 

    IF First.EmployeeNo THEN Counter +1; 
    ELSE IF First.CustomerNo THEN Counter +1; 
    ELSE IF StartDate GE lag_Start AND Startdate LT lag_End THEN Counter = Counter; 
    ELSE IF StartDate LE lag_End1 THEN Counter = Counter; 
    ELSE IF TechnNo = lag2_Techn AND CustNo = lag2_Cust AND StartDate LE lag2_End1 THEN Counter = Counter; 
    ELSE IF TechnNo = lag3_Techn AND CustNo = lag3_Cust AND StartDate LE lag3_End1 THEN Counter = Counter; 
    ELSE IF TechnNo = lag4_Techn AND CustNo = lag4_Cust AND StartDate LE lag4_End1 THEN Counter = Counter; 
    ELSE IF TechnNo = lag5_Techn AND CustNo = lag5_Cust AND StartDate LE lag5_End1 THEN Counter = Counter; 
    ELSE Counter +1; 

Run;