1

次のデータがあります。

data have;
   input username $  betdate : datetime. customerCode;
   dateOnly = datepart(betdate) ;
   format betdate DATETIME.;
   format dateOnly ddmmyy8.;
   datalines; 
    player1 12NOV2008:12:04:01 1
    player1 04NOV2008:09:03:44 10
    player2 07NOV2008:07:03:33 1 
    player2 05NOV2008:09:00:00 0.5 
    player3 05NOV2008:09:05:00 1
    player2 07NOV2008:14:03:33 1 
    player1 05NOV2008:09:00:05 20
    player2 07NOV2008:16:03:33 1 
    player2 07NOV2008:18:03:33 1 
    player2 09NOV2008:10:05:10 0.7
    player3 15NOV2008:15:05:33 10 
    player3 15NOV2008:15:05:33 1
    player2 15NOV2008:15:05:33 0.1
run;
PROC PRINT; RUN;

「proc sql」コマンドを実行して、各プレーヤーの最新 (つまり、個別の (customerCode) と最新の日付 (つまり、max(betdate)) および各プレーヤーの最も早い (再び betdate による) customerCode の更新を引き出すにはどうすればよいですか? これは時々変化する動的変数? テーブルから max(betdate) と customerCode を探して、各ユーザー名に対してサブセレクトを実行する必要がありますか?

ありがとう。

4

2 に答える 2

1

PROC SQL は最も簡単な方法ではありませんが、確かに可能です。

proc sql;
 select H.username, H.customercode from have H inner join (
  select username, max(betdate) as maxdate from have group by username
 ) V
 on H.username=V.username and H.betdate=V.maxdate;
quit;

これは Player3 に対して 2 つの値を返します。同点を解決する方法を考え出す必要があります。ただし、データ ステップははるかに簡単で、多くても 1 つの並べ替えと 1 つのパスが必要です (ハッシュではさらに高速になり、IML マトリックスではさらに高速になります)。

于 2013-08-01T21:12:47.267 に答える
1

proc sql「再結合」による集約と呼ばれる機能を使用できます。次のクエリは、ユーザー名ごとの最大日付を含むすべての行を出力します。

proc sql;
 select H.username, H.customercode, date, max(date) as maxdate
 from have H 
 group by H.username
quit;

これをサブクエリに入れて、必要な値を取得できます。

proc sql;
 select username, customercode, date
 from (select H.username, H.customercode, date, max(date) as maxdate
       from have h
       group by H.username
      ) h
 where date = maxdate;
quit;

以下も機能する可能性がありますが、現在の場所をテストするための SAS が手元にありません。

proc sql;
  select H.username, H.customercode, date
  from have H 
  group by H.username
  having date = max(date)
quit;
于 2013-08-01T21:44:45.780 に答える