получить номер строки на шаге данных с помощью sas

есть ли способ сделать раздел over, чтобы получить номер строки в sas? В sql я бы сказал:

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

Я хочу сделать это в наборе данных предпочтительно

2 ответов


вы можете сделать это на шаге данных легко, используя оператор 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;

как упоминал Джо, вы можете установить формат для своего row_num в зависимости от того, сколько obs вы получите в этой группе.


для дублирования SQL ROW_NUMBER функция Windowing, вы должны отсортировать набор данных по и the PARTITION и ORDER 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 оператор на шаге данных соответствует the PARTITION BY предложение в ANSI SQL, но PROC SORT шаг также сортируется по столбцам в ORDER BY предложения. Также обратите внимание, что если запрос, который вы "переносите", содержит ORDER BY SQL предложение, вы должны следовать этому с другим PROC SORT шаг.