0

我正在寻找一种在 SAS 中使用最近日期的方法。我在网上看过很多例子,但由于它们的复杂性和我对 SAS 的缺乏经验,我无法根据我的需要适当地调整它们。为了保持一致性,该解决方案最好使用 SQL(通过 proc sql),但如果在 SAS 代码中更容易完成相同的任务,那么这也是可以接受的。

我正在查询的表(表 B)的数据类似于:

    ID        Contract   Plan Code     From       Thru 
  8516515      S5000        000      1/1/2013   2/28/2013 
  8516515      S6100        010      1/1/2012  12/31/2012
  8516515      H3565        025      1/1/2011  12/31/2011

我在内部加入上述数据的表(表 A)与此类似:

    ID           PA
  8516515    ITPNB010412

我用来查询表 B 的日期是在一个名为的宏变量中分配的date_of_report,在上面的示例(表 B)date_of_report中是"11Apr2013"d.

我希望在表 B 中制作代码拉线 #1 而不是其他。在任何情况下,我们都不应该对特定的时间范围进行四舍五入……只选择最近符合条件的行。

4

2 回答 2

1

这在 SAS 中很容易解决。有两种相当简单的解决方案,具体取决于您是否需要为表 A 中的单个记录或可能为多个记录(例如多个 ID)解决此问题。

data tableB;
informat from Thru MMDDYY10.;
input ID        Contract   $ Plan_Code     From       Thru;
datalines;
8516515      S5000        000      1/1/2013   2/28/2013 
8516515      S6100        010      1/1/2012  12/31/2012
8516515      H3565        025      1/1/2011  12/31/2011
;;;;
run;

data tableA;
input  ID           PA $;
datalines;
8516515    ITPNB010412
;;;;
run;

鉴于这些 tableA 和 tableB,这里是解决方案 1 - 当 tableA 只有一个 ID 时有效。

proc sort data=tableB;
by ID thru;
run;

%let dateofreport='12APR2013'd;
data tableC;
set tableB;
by ID thru;
retain a_set;
if first.ID then a_set=0;
if from le &dateofreport. le thru then do;
  set tableA;
  a_set=1;
end;
else call missing(PA);
if not(a_set) and (last.id) then 
  set tableA;
run;

如果您有多个 ID,则情况会有所不同。(这适用于单个 ID 或多个 ID 的情况)。

data tableC;
merge tableB tableA;
by id;
drop PA PA_set;
length PA_n $10;
retain PA_set;
if first.id then PA_set=0;
if (from le &dateofreport. le thru) or (last.id and PA_set=0) then do;
    PA_n=PA;
    PA_set=1;
end;
rename PA_n=PA;
run;

我确信这可以在 PROC SQL 中完成,但我认为这需要多次传递数据。我可以想象最简单的方法是创建两个数据集,一个只有 max(thru),一个带有来自 le &dateofreport le thru 的记录,然后将它们合并在一起,然后保留该集合中的记录与最低日期值(即,唯一的记录,或者如果两者都保留不是 max(thru) 的记录)。

于 2013-04-12T17:02:07.003 回答
0

一个完美(且经过测试)的 SQL 方法是执行以下操作(取自此处):

data a;
  dt='02JUN2012'd;
run;

data b;
  dt='01JUN2012'd;
  output;
  dt='03JUN2012'd;
  output;
run;

proc sql;
    select
      a.dt as dt_a,
      b.dt as dt_b,
      count(*),
      abs(a.dt-b.dt) as diff
    from a,b
    group by a.dt
    having calculated diff=min(calculated diff)
  ;
quit;
于 2013-04-15T20:33:53.017 回答