2013-06-09 1 views

Odpowiedz

6

Można to zrobić na etapie danych łatwo za pomocą stwierdzeniem, to i zrobić bieganie suma:

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

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

Również ennmuarete wszystkie obs można używać wbudowanego w funkcje:

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

Jak wspomniano Joe może chcesz ustawić format dla ROW_NUM zależności od tego ile obs co można uzyskać w ramach tego ugrupowania.

+0

@Joe dobry połów! i całkowicie się z tym zgadzam, ja to zredagowałem! dzięki! – isJustMe

+0

tak, jesteś mgith być napowietrznych w tym przypadku – isJustMe

+0

W tej odpowiedzi brakuje kroku sortowania, o którym Bob wspomina poniżej. Bez dodawania dodatkowego kroku sortowania nie można uzyskać takich samych wyników jak powyższy przykład SQL. –

2

powielać funkcji SQL ROW_NUMBER okienkowanie, trzeba sortować dane określone przez zarówno klauzul PARTITION i ORDER BY. W kolejnym kroku danych SET posortowany zestaw danych za pomocą zmiennej (zmiennych) partycji i użycie automatycznej zmiennej zmiennej FIRST. przydziela nową zmienną liczby wierszy.

Oto rozwiązanie dla podanego przykładu:

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; 

Wskazówka oświadczenie w etapie danych BY odpowiada klauzuli PARTITION BY w ANSI SQL, ale kroku PROC SORT sortuje także kolumn w klauzuli ORDER BY. Zauważ też, że jeśli zapytanie, które "migrujesz" zawiera klauzulę SQL ORDER BY, musisz wykonać to z kolejnym krokiem PROC SORT.