SAS SQL从单一日期数据表中输出连续日期的范围

SAS SQL从单一日期数据表中输出连续日期的范围,sql,date,sas,Sql,Date,Sas,我正在尝试编写一个SAS/SQL程序,该程序将读取特定表的一列中的所有日期,按时间顺序组织这些日期,检查列中连续日期范围的分组,然后输出每个日期范围的开始和结束日期。每个日期范围对应于另外两个分类因素:位置和汽车类别 因此,实际上,我需要从每个位置的每个汽车类别的日期表中获得连续日期的范围 样本输入: Location car length date ABC C 7

我正在尝试编写一个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

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

PROC-SQL实际上不是解决此类问题的正确工具。只需使用一个简单的数据步骤

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

首先创建一个组变量

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

只要做一点工作,你就可以把它简化为一个步骤。

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

下面是我使用单个
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;

您能展示示例输入和输出数据吗?你试过什么?为什么使用PROC/SQL而不是数据步骤?我将在问题中显示示例数据。我曾尝试使用左连接检查连续日期,并尝试过over(order by…)语句实现,但由于这些语句在PROC SQLC中无效,因此该语句实现无效。我在哪里指定输入数据的来源?中间还是有?我指定了“set have”处的数据输入。然而,我在以“by location”开头的两行中发现了错误,声称这是一个语法错误。因此,当我运行数据步骤时没有输出。如果您收到错误消息,则不应创建输出数据集,如日志中的注释所示。我看不出上面写的BY语句有什么错。在SAS中首先要检查的是放错了分号。还需要按by语句中的变量进行排序,否则会出现错误。不同意-Proc SQL与您的解决方案一样有效,并且可能具有更简洁/更短的语法(在我看来)-只需要一个
Proc SQL
。此实现输出了一个结果表,其中包含日期、位置、车辆类型,每次观察的长度和计数,但没有给出位置、车型和长度的不同组合的开始日期和结束日期。如何让它输出这些日期范围而不是按时间顺序输出日期?您可以更改日期9。对于ddmmyy10。如果您想以dd/mm/yyyy格式显示日期,只需获取每辆车的开始和停止日期。它不能解决如何检测连续间隔的实际问题。一旦你有一个按位置、车型和长度按时间顺序分类的日期表,你如何输出各个范围?你的原始示例有点混乱-看看@tom解决方案,现在我了解你的要求。所以我的解决方案不适合这个问题。很抱歉
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;