在SAS中按组选择一列中的天数

时间:2014-01-02 16:17:12

标签: sql date sas proc

我正在尝试识别在90天内执行三项或更多服务的ID。 我有列:服务日期,ID,服务和其他类型的人口统计信息。 你能帮帮我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

草拟一种可能的解决方案:

  • 按ID和日期对数据集进行排序
  • 对于每个ID,按顺序处理所有服务,使用lag / retain / dow-loop将前两个服务的日期与当前服务的日期进行比较。
  • 如果两个差异均小于90天,则输出该ID。

这可能会多次为您提供一些ID,但您可以通过第二次传递轻松删除任何重复项,或者如果输出当前ID,则跳过下一个ID。

以下是使用DOW-loop进行的尝试 - 我认为这样做可以满足我在下面使用的示例数据。如果您发现任何不能按预期工作的情况,请告诉我。

data have;
  format service_date date9.;
  informat id 8. service_date date9. service $1.;
  input id service_date service;
  datalines;
1 01jan2013 a
1 01feb2013 b
1 14feb2013 c
1 15feb2013 d
2 01mar2013 a
2 01mar2013 a
2 01oct2013 a
2 01oct2013 a
;
run;

data want;
  array dates[3];
  do _n_ = 1 by 1 until (last.ID);
    set have;
    by ID;
    dates[mod(_n_,3)+1] = service_date;
    if _n_ >= 3 then do;
      if intnx('month', dates[mod(_n_,3)+1],-3) <= min(dates[mod(_n_-1,3)+1], dates[mod(_n_-2,3)+1]) then do;
        output;
        delete;
      end;
    end;
  end;
run;

我似乎无意中将此设置为发现在3个月内而不是90天内有3个或更多服务的情况,但这很容易改变。