首页 > 解决方案 > SAS - 根据滞后数据创建错误报告

问题描述

我需要从数据集中创建一个(简单的?)错误报告。数据集如下所示:

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,但因为其他所有观察结果都是 FALSE,所以滞后值完全失控,使我无法执行以下操作:

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

如果有人可以提供一些帮助,我将不胜感激。我对此一无所知。

谢谢!

标签: sas

解决方案


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;

在此处输入图像描述


推荐阅读