我正在尝试编写一个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
如此有效,我需要找到具有相同位置,车型和长度的观测值,然后找到它们之间的日期范围,并将日期范围与其他分类一起输出。
答案 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;