Добавление счетчика в SAS на основе нескольких условий

Я хотел бы попросить помощи в проблеме SAS, связанной со счетчиком, основанным на нескольких условиях.

У меня есть набор данных, содержащий информацию о посещениях клиентов сотрудниками отдела продаж. Однако набор данных организован по задачам, которые выполнялись во время посещений, поэтому он может содержать несколько записей для одного и того же посещения. Сами посещения могут охватывать несколько дней. В настоящее время набор данных отсортирован по общему идентификатору.

Также вы можете найти скриншот набора данных здесь: Извлечение данных

Мне нужно ввести счетчик, который четко идентифицирует записи, относящиеся к одному и тому же посещению. Счетчик должен основываться на следующих условиях:

  • Новый счетчик посещений для той же комбинации «сотрудник-клиент» только в том случае, если следующие условия для дат НЕ выполняются: 1) записи относятся к соседним дням и 2) одна запись не «встроена» в запись о текущем посещении.
  • Я считаю, что нашел решение сам. Вероятно, это немного грубая сила, но, похоже, она хорошо работает для более чем 300 тысяч записей.

StartDate и EndDate в этом смысле определяют диапазон времени, что важно для классификации соответствующих записей.

Это набор данных (включая предполагаемое решение и комментарии для каждой записи, которые могут помочь прояснить приведенные выше условия):

Перед началом я отсортировал свой набор данных по 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;

С уважением, мейб

Новый счетчик посещений для каждой новой комбинации «сотрудник-клиент».


person mabe    schedule 15.12.2016    source источник
comment
Включайте данные в виде текста, а не изображений. Если кто-то хочет попробовать решение, которое они тестируют, он должен вручную ввести ваши данные.   -  person user667489    schedule 15.12.2016
comment
Спасибо за совет, только что отредактировал свой пост.   -  person Reeza    schedule 15.12.2016
comment
ID StartDate EndDate EmployeeNo CustomerNo Запланированное решение Комментарий 1 01.06.2009 01.07.2009 1 5 1 Дни смежные 2 01.07.2009 01.08.2009 1 5 1 Дни смежные 3 01.08.2009 01.08.2009 1 5 1 Дни смежные 4 05.90.06 05.90.2009 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.02 3 1 3 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 Раздельно, т.к. 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 21.09.20 22.09.2010 8 4 9 - 17 21.09.2010 21.09.2010 9 1 1 0 соседние дни 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 Смежные дни 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 1 07.05.2012 5 2 01.07.2012 .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 6ja 01.49.2 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 Раздельно, т.к. Смежные дни 34 09.04.2014 09.05.2014 5 7 18 Смежные дни 35 06.01.2015 06.01.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 .2015 10 4 22 Отдельно, так как разные работники, но смежные дни 40 11.06.2015 12.06.2015 10 4 22 Отдельно, так как разные работники, но смежные дни 41 10.06.2015 10.06.2015 10 4 22 Отдельно, так как разные работники, но смежные дни   -  person mabe    schedule 15.12.2016


Ответы (1)


Бежать;

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;

Пожалуйста, опубликуйте код, который вы пробовали до сих пор. Разместите образец входных и выходных данных в виде текста в вопросе, а не в виде изображения.

person mabe    schedule 20.12.2016