2016-12-15 8 views
0

複数の条件に基づいてカウンタを使用するSASの問題についてのヘルプを依頼したいと思います。複数の条件に基づいてSASにカウンタを追加する

私は営業員の顧客訪問を含むデータセットを持っています。ただし、データセットは訪問中に実行されたタスクによって編成されているため、同じ訪問のための複数のエントリを含めることができます。訪問数自体は数日間にまたがることがあります。現在、データセットは汎用IDでソートされています。

また、ここでデータセットのスクリーンショットをご覧ください:Data extract

を私ははっきりと同じ訪問に属しているエントリを特定するカウンタを導入する必要があります。

  • すべての新しい従業員、顧客の組み合わせのための新しい訪問カウンター:カウンターには、以下の条件に基づくべきです。
  • 日付の以下の条件が真でない場合に限り、同じ従業員 - 顧客の組み合わせに対する新しい訪問カウンタ:1)エントリは隣接日からのものであり、2)進行中の訪問のエントリに1つのエントリが埋め込まれていない

StartDateとEndDateという意味では、それぞれのエントリの分類に重要な時間範囲を定義します。

これは(上記の条件を明確にするのを助けることができる各エントリの意図された溶液およびコメントを含む)データセットである:

ID開始日終了日EmployeeNo CustomerNo対象ソリューションコメント 1 2009年1月6日2009年1月7日1 5 1隣接日 2 2009年1月7日2009年1月8日1 5 1隣接日 3 2009年1月8日2009年1月8日1 5 1隣接日 4 2009年5月1日2009年6月1日2~7隣接する2日間 5 2009年1月6日2009年7月1日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 2012年5月7日2012年5月7日1 2 13 - 26 2012年5月9日2012年5月9日1 2 14とは別に、無隣接日以降 27 2013年9月7日2013年7月9日3 10 15隣接日間 28 2013年7月10日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 11.06.2015 12.06.2015 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別に従業員が異なるため、隣接する日

開始する前に、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

私は解決策を自分で考え出したと信じています。おそらくそれは少し強烈な力ですが、300kを超えるエントリーではうまくいくようです。

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; 

実行;

関連する問題