1

多くのユーザーに対して次のクエリを実行しています。

proc SQL;
  select 
  username, 
  (select min(sub.date) from sample sub where sub.username = outer.username)  Format=worddatx20.  as firstDate,
  date Format=worddatx20. AS betdate,
  monotonic() as numberOfDaysActive
  from sample as outer;
quit; 

Monotonic() は、ユーザーに関係なく返される行の先頭からカウントするだけなので、numberOfDaysActive に正しい値を与えません。各ユーザーについて、ユーザーがデータベースに最初に登録された日がいつであるかを知る必要があり、その後、ユーザーが存在する日ごとに日数がカウントされます。

サンプル データは次のとおりです。

 INPUT username $ amount date5 : ddmmyy8.;
 DATALINES; 
 player1 90 12/11/08
 player1 100 04/11/08
 player2 120 07/11/08
 player1 50 05/11/08
 player1 30 05/11/08
 player1 20 05/11/08
 player2 10 09/11/08
 player2 35 15/11/08
 PROC PRINT; RUN;

「numberOfDaysActive」フィールドに必要なものは次のとおりです。

 player1 90 12/11/08 3
 player1 100 04/11/08 1
 player2 120 07/11/08 1
 player1 50 05/11/08 2
 player1 30 05/11/08 2
 player1 20 05/11/08 2 
 player2 10 09/11/08 2 
 player2 35 15/11/08 3

前もって感謝します。

4

1 に答える 1

2

SAS を使用する SQL でこれを行うことはできません。SAS は現在、ウィンドウ関数をサポートしていません。これは、データセットをソートし、 numberOfDaysActive変数を必要に応じて計算することを含むソリューションです。

data have;
   input username $ amount date5 : ddmmyy8.;
   format date5 ddmmyy8.;
   row_id + 1;
   datalines; 
player1 90 12/11/08
player1 100 04/11/08
player2 120 07/11/08
player1 50 05/11/08
player1 30 05/11/08
player1 20 05/11/08
player2 10 09/11/08
player2 35 15/11/08
run;

proc sort data=have;
   by username date5;
run;

data want;
   set have;
      by username date5;
   retain numberOfDaysActive;
   if first.username then numberOfDaysActive = 0;
   if first.date5 then numberOfDaysActive + 1;
run;

proc sort data=want;
   by row_id;
run;

データの元の順序を保持するために使用される変数 (row_id) を追加したことに注意してください。それが必要かどうかは明らかではありませんが、念のためにあります。また、私の結果は指定したものと正確には一致しません。最後の 2 行では、 player2に対して23の値が計算されています。指定された値が本当に1である必要がある場合、それがどのように行われたかはわかりません。

于 2013-06-06T04:20:24.983 に答える