Sas 唯一id的最早开始日期

Sas 唯一id的最早开始日期,sas,Sas,ESN是一个id列,每个ESN有多个观测值,因此会出现重复的ESN值。对于给定的esn,我想找到最早的服务开始日期(并首先调用它),我想找到正确的结束日期(称为last)。关于如何选择“last”的if/then语句是正确的,但当我运行下面的代码时,我得到以下错误: 340 first = min(of start(*)); --- 71 ERROR 71-185: The MIN function call does n

ESN是一个id列,每个ESN有多个观测值,因此会出现重复的ESN值。对于给定的esn,我想找到最早的服务开始日期(并首先调用它),我想找到正确的结束日期(称为last)。关于如何选择“last”的if/then语句是正确的,但当我运行下面的代码时,我得到以下错误:

340        first = min(of start(*));
               ---
               71
ERROR 71-185: The MIN function call does not have enough arguments.
这是我使用的代码

data three_1; /*first and last date created ?? used to ignore ? in data*/
set three;
format first  MMDDYY10. last  MMDDYY10.;
by esn;
array start(*)  service_start_date;
array stop(*) service_end_date entry_date_est ;
do i=1 to dim(start);
  first = min(of start(*));
end;
do i=1 to dim(stop);
  if esn_status = 'Cancelled' then last = min(input(service_end_date, MMDDYY10.), input(entry_date_est, MMDDYY10.));
  else last = max(input(service_end_date, MMDDYY10.), input(entry_date_est, MMDDYY10.));
end;
run;
“esn”“服务开始日期”“服务结束日期”“输入日期”“esn状态”

2010年10月12日2010年1月1日2100年10月12日取消

1 05/02/2009 02/12/2010 10/09/2012取消

2011年5月04日2100年4月03日2012年2月10日取消


结果应该是first=05/02/2009,last=10/12/2012

道琼斯指数循环将到达您想要的位置,或者您可以用SQL实现。据我所知,您期望的结果与实际结果不匹配,因此您可能需要进行一些调整。您需要为未取消的人提供第二个想要的数据集,我不认为有一种简单的方法可以将其放在一个数据步骤中

data have;
length esn_status $10;
format service_start_date service_end_date entry_date_est MMDDYY10.;
input esn (service_start_date service_end_date entry_date_est) (:mmddyy10.) esn_status $;
datalines;
1 10/12/2010 01/01/2100 10/12/2012 cancelled
1 05/02/2009 02/12/2010 10/09/2012 cancelled
1 04/05/2011 03/04/2100 10/02/2012 cancelled
;;;;
run;
data want_cancelled;
first = 99999;
last = 99999;
do _n_ = 1 by 1 until (last.esn);
 set have(where=(esn_status='cancelled'));
 by esn;
 first = min(first,service_start_date);
 last = min(last,service_end_date,entry_date_est);
end;
output;
keep first last esn;
format first last mmddyy10.;
run;

DoW循环将到达您想要的位置,或者您可以在SQL中完成。据我所知,您期望的结果与实际结果不匹配,因此您可能需要进行一些调整。您需要为未取消的人提供第二个想要的数据集,我不认为有一种简单的方法可以将其放在一个数据步骤中

data have;
length esn_status $10;
format service_start_date service_end_date entry_date_est MMDDYY10.;
input esn (service_start_date service_end_date entry_date_est) (:mmddyy10.) esn_status $;
datalines;
1 10/12/2010 01/01/2100 10/12/2012 cancelled
1 05/02/2009 02/12/2010 10/09/2012 cancelled
1 04/05/2011 03/04/2100 10/02/2012 cancelled
;;;;
run;
data want_cancelled;
first = 99999;
last = 99999;
do _n_ = 1 by 1 until (last.esn);
 set have(where=(esn_status='cancelled'));
 by esn;
 first = min(first,service_start_date);
 last = min(last,service_end_date,entry_date_est);
end;
output;
keep first last esn;
format first last mmddyy10.;
run;
数组和min()、max()等函数跨数据集的行水平运行,而不是跨多个记录垂直运行

假设给定esn的esn_状态为常量,则需要按esn和服务开始日期对输入进行排序。可以使用数据步骤收集所需的值

data three; /*thanks Joe for the data step to create the example data*/
length esn_status $10;
format service_start_date service_end_date entry_date_est MMDDYY10.;
input esn (service_start_date service_end_date entry_date_est) (:mmddyy10.) esn_status $;
datalines;
1 10/12/2010 01/01/2100 10/12/2012 cancelled
1 05/02/2009 02/12/2010 10/09/2012 cancelled
1 04/05/2011 03/04/2100 10/02/2012 cancelled
;;;;
run;

proc sort data=three;
by esn service_start_date;
run;

data three_1(keep=esn esn_status start last);
set three;
format start last date9.;
by esn;
retain start last;
if first.esn then do;
    start = service_start_date;
    last = service_end_date;
end;

if esn_status = "cancelled" then
    last = min(last,service_end_date,entry_date_est);
else
    last = max(last,service_end_date,entry_date_est);

if last.esn then
    output; 
run;
数组和min()、max()等函数跨数据集的行水平运行,而不是跨多个记录垂直运行

假设给定esn的esn_状态为常量,则需要按esn和服务开始日期对输入进行排序。可以使用数据步骤收集所需的值

data three; /*thanks Joe for the data step to create the example data*/
length esn_status $10;
format service_start_date service_end_date entry_date_est MMDDYY10.;
input esn (service_start_date service_end_date entry_date_est) (:mmddyy10.) esn_status $;
datalines;
1 10/12/2010 01/01/2100 10/12/2012 cancelled
1 05/02/2009 02/12/2010 10/09/2012 cancelled
1 04/05/2011 03/04/2100 10/02/2012 cancelled
;;;;
run;

proc sort data=three;
by esn service_start_date;
run;

data three_1(keep=esn esn_status start last);
set three;
format start last date9.;
by esn;
retain start last;
if first.esn then do;
    start = service_start_date;
    last = service_end_date;
end;

if esn_status = "cancelled" then
    last = min(last,service_end_date,entry_date_est);
else
    last = max(last,service_end_date,entry_date_est);

if last.esn then
    output; 
run;

esn的格式为mmddyy10。您是在尝试确定每行或跨行的最大和最小日期?您能更详细地描述(或显示)您的输入数据吗?给定的esn可能有多行,其中日期服务开始日期在该特定esn中更改,这就是我使用min函数的原因。我将用底部的一个示例编辑文章。ESN实际上是一个字符变量,因为某些值以字母开头。ESN的格式为mmddyy10。您是在尝试确定每行或跨行的最大和最小日期吗?您能更详细地描述(或显示)您的输入数据吗?给定的esn可能有多行,其中日期服务开始日期在该特定esn中更改,这就是我使用min函数的原因。我将在底部用一个例子编辑这篇文章。ESN实际上是一个字符变量,因为有些值以字母开头。