SAS SQL输出连续日期的范围来自单个日期的数据表

时间:2016-06-09 15:49:06

标签: sql date sas

我正在尝试编写一个SAS / SQL程序,它将读取特定表的列中的所有日期,按时间顺序组织这些日期,检查列中连续日期范围的分组,然后输出开始和每个日期范围的结束日期。每个日期范围对应于另外两个分类因素:位置和汽车类别。

如此有效,我需要每个地点的每个汽车类别的日期表中的连续日期范围。

示例输入:

Location           car            length          date
ABC                 C               7           1/13/2014
ABC                 D               10          2/6/2016
ABC                 C                7          1/12/2014
ABC                 D                10         2/7/2016

期望的输出:

Location      Car           length        start date range      end date range
ABC            C              7               1/12/2014             1/13/2014
ABC            D              10              2/6/2016              2/7/2016

如此有效,我需要找到具有相同位置,车型和长度的观测值,然后找到它们之间的日期范围,并将日期范围与其他分类一起输出。

2 个答案:

答案 0 :(得分:0)

PROC SQL并不是解决此类问题的正确工具。只需使用简单的数据步骤。

首先,让我们创建一些示例数据并确保它已排序。 (我更喜欢用年,月,日的顺序显示日期,它可以消除对哪一部分是哪一天以及哪一个月的混淆。)

data have;
  input location $ car $ length date;
  informat date mmddyy.;
  format date yymmdd10.;
cards;
ABC C  7  1/13/2014
ABC D 10  2/6/2016
ABC C  7  1/12/2014
ABC D 10  2/7/2016
ABC C  7  1/25/2014
;;;;
proc sort data=have;
  by location car length date;
run;

首先制作一个组变量。

data middle;
  set have ;
  by location car length date ;
  if first.length or dif(date) ne 1 then group+1;
  if first.length then group=1;
run;

然后选择每组的最小和最大日期。

data want ;
  set middle;
  by location car length group;
  if first.group then start_date=date;
  if last.group then stop_date=date;
  if last.group;
  retain start_date;
  format start_date stop_date yymmdd10.;
  drop date;
run;

这将产生此表。

location    car    length    group    start_date     stop_date
  ABC        C        7        1      2014-01-12    2014-01-13
  ABC        C        7        2      2014-01-25    2014-01-25
  ABC        D       10        1      2016-02-06    2016-02-07

通过一点点工作,您可以将其简化为单步。

答案 1 :(得分:0)

似乎是一个非常直接的要求(除非我在这里遗漏了一些明显的东西)。

这是我使用单proc sql的方法:

proc sql;
create table desired_output as select 
    location
    ,car
    ,length
    ,min(date) as start_date_range format=date9.
    ,max(date) as end_date_range format=date9.
from your_input_table
group by 1,2,3;
quit;