SAS - Создание отчета об ошибках на основе данных о задержке - PullRequest
0 голосов
/ 13 октября 2018

Мне нужно создать (простой?) Отчет об ошибках из набора данных.Набор данных выглядит следующим образом:

Contract   DrvrNum   LicNum
 -------   -------   ---------
 2212621         2   8241323
 2212621         2   65256129
 6385371         1   973385261
 6385371         3   973385261
 2366922         1   B931151BA
 2366922         2   B931151BA
 1007922         1   60916004
 1007922         2   60916004

Первые 2 наблюдения указывают, что у меня есть два разных номера лицензии для одного и того же драйвера, тогда как следующие три пары наблюдений указывают, что номер лицензии был дублирован для двух илибольше драйверов.

Мой вывод должен выглядеть следующим образом:

Contract   DrvrNum   LicNum     ErrorReason
 -------   -------   ---------  -----------
 2212621         2   8241323    
 2212621         2   65256129   Multiple License Numbers for Same Driver
 6385371         1   973385261
 6385371         3   973385261  Duplicate License Number
 2366922         1   B931151BA
 2366922         2   B931151BA  Duplicate License Number
 1007922         1   60916004
 1007922         2   60916004   Duplicate License Number

Я пытался использовать функцию LAG () в шаге данных в сочетании с first.Contract = 0 , но поскольку каждое другое наблюдение является ЛОЖНЫМ, значения запаздывания вышли из-под контроля, не позволяя мне делать что-то вроде:

if LicNum = lag(LicNum) then ErrorReason = 'Duplicate License Number';
else ErrorReason = 'Multiple License Numbers for Same Driver';

Если кто-то может оказать некоторую помощь, ябыл бы благодарен.Я нахожусь в конце этого остроумия.

Спасибо!

1 Ответ

0 голосов
/ 13 октября 2018

Очередь значений для LAG () основана на том, когда вы выполняете функцию LAG ().Это не имеет ничего общего с наблюдениями в вашем наборе данных.Так что в общем случае вы не хотите условно выполнять функцию LAG ().Таким образом, вместо этого вам следует безоговорочно присвоить значение переменной, а затем вы можете условно проверить значение переменной.

Но LAG () не решит вашу проблему, если в контракте будет более двух наблюдений.Попробуйте что-то вроде этого, чтобы отслеживать все номера лицензий по контракту.

data have ;
  input Contract :$10. DrvrNum LicNum :$10. ;
cards;
2212621 2 8241323
2212621 2 65256129
6385371 1 973385261
6385371 3 97338526x
6385371 3 973385261
2366922 1 B931151BA
2366922 2 B931151BA
1007922 1 60916004
1007922 2 60916004
;

data want ;
   set have ;
   by contract drvrnum licnum notsorted;
   length ErrorReason $100 LicenseList $200 ;
   retain licenselist ;
   if first.contract then licenselist=LicNum;
   else do;
     if indexw(licenselist,LicNum,' ') then
       ErrorReason = catx(' ',ErrorReason,'Duplicate License Number.')
     ;
     else licenselist=catx(' ',licenselist,licnum);
     if first.licnum and not first.drvrnum then
       ErrorReason = catx(' ',ErrorReason,'Multiple License Numbers for Same Driver.')
     ;
   end;
run;

enter image description here

...