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