有没有办法进行过度分区以获取 sas 上的行号?在sql中,我会喜欢:
Select region,company, ROW_NUMBER() OVER(PARTITION BY region ORDER BY Name)
From companyData;
我想最好在数据集中执行此操作
有没有办法进行过度分区以获取 sas 上的行号?在sql中,我会喜欢:
Select region,company, ROW_NUMBER() OVER(PARTITION BY region ORDER BY Name)
From companyData;
我想最好在数据集中执行此操作
您可以使用 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 的格式。
要复制 SQL ROW_NUMBER
Windowing 函数,您必须同时按PARTITION
andORDER 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 BY
SQL 子句,则必须在此之后执行另一个PROC SORT
步骤。