1

ESN は、esn ごとに複数の観測値を持つ id 列であるため、esn の値が繰り返されます。特定のesnについて、最も早いサービス開始日を見つけたい(そしてそれを最初に呼び出す)、そして適切な終了日(最後と呼ばれる)を見つけたい 「最後」がどのように選択されるかについての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" "service_start_date" "service_end_date" "entry_date_est" "esn_status"

1 10/12/2010 01/01/2100 10/12/2012 キャンセル

1 2009 年 5 月 2 日 2010 年 2 月 12 日 2012 年 10 月 9 日 キャンセル

1 2011/04/05 2100/03/04 2012/10/02 キャンセル

結果は first= 05/02/2009 および last=10/12/2012 である必要があります

4

2 に答える 2

1

配列と min()、max() などの関数は、複数のレコードにわたって垂直方向ではなく、データ セットの行にわたって水平方向に動作します。

esn_status が特定の esn に対して一定であると仮定すると、入力を esn と service_start_date でソートする必要があります。データ ステップを使用して、必要な値を収集できます。

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;
于 2013-09-07T22:33:19.200 に答える