9

有没有办法进行过度分区以获取 sas 上的行号?在sql中,我会喜欢:

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

我想最好在数据集中执行此操作

4

2 回答 2

8

您可以使用 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;

此外,要 ennmuarete 所有 obs,您可以使用内置功能:

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

正如乔所提到的,您可能希望根据在该分组中获得的 obs 数量来设置 row_num 的格式。

于 2013-06-09T05:35:14.850 回答
3

要复制 SQL ROW_NUMBERWindowing 函数,您必须同时PARTITIONandORDER BY子句对数据集进行排序。在随后的数据步骤中,SET排序后的数据集按分区变量并使用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数据步骤中的语句对应PARTITION BY于 ANSI SQL 中的子句,但该PROC SORT步骤也按子句中的列排序ORDER BY。另请注意,如果您正在“迁移”的查询包含ORDER BYSQL 子句,则必须在此之后执行另一个PROC SORT步骤。

于 2013-06-09T13:59:30.977 回答