web-dev-qa-db-ja.com

sasを使用してデータステップの行番号を取得する

Sasの行番号を取得するためにオーバーパーティションを作成する方法はありますか? SQLでは私は次のようになります:

  Select region,company, ROW_NUMBER()  OVER(PARTITION BY region ORDER BY Name)
    From companyData;

私はできればデータセットでこれをしたい

9
user2467660

Byステートメントを使用して、データステップで簡単に実行できます。

proc sort data=myData; by region name; run;

Data myData;
Set myData;
By company;
if first. company then n=1;
   else n+1;
run;

また、組み込みの機能を使用できるすべてのobsをennmuareteするには:

DATA COMPANYDATA;
SET COMPANYDATA;
ROW_NUM=_N_;    
RUN;

Joeが述べたように、そのグループ内で取得するobsの量に応じて、row_numのフォーマットを設定することができます。

8
isJustMe

SQL ROW_NUMBERウィンドウ関数を複製するには、データセットをbothPARTITIONおよびORDER BY句でソートする必要があります。後続のデータステップでは、パーティション変数によってSET並べ替えられたデータセットonlyを使用し、FIRST.自動変数コントロールを使用して新しい行番号変数を割り当てます。

ここにあなたが述べた例の解決策があります:

proc sort data=companyData;
   by region name;
run;
data want;
   set companyData;
      by region;
   if first.region then row_number = 1;
                   else row_number + 1;
run;

データステップのBYステートメントはANSI SQLのPARTITION BY句に対応していますが、PROC SORTステップもORDER BY句の列で並べ替えられています。また、「移行中」のクエリにORDER BY SQL句が含まれている場合は、これに続いて別のPROC SORTステップを実行する必要があります。

3
BellevueBob