2013-06-09 9 views

risposta

6

Si può fare in un passaggio di dati facilmente utilizzando la dalla dichiarazione, e il fare una corsa sum:

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

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

Anche per ennmuarete tutti gli OB è possibile utilizzare il costruito nelle caratteristiche:

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

Come accennato Joe si potrebbe desiderare di impostare il formato per la vostra row_num a seconda di quanto oss si otterrebbe all'interno di tale raggruppamento.

+0

@Joe buona cattura! e sono completamente d'accordo su entrambi, l'ho modificato! Grazie! – isJustMe

+0

sì, tu sei un overhead in questo caso – isJustMe

+0

Questa risposta manca la fase di smistamento che Bob menziona di seguito. Senza aggiungere il passaggio di ordinamento aggiuntivo non è garantito ottenere gli stessi risultati dell'esempio SQL sopra riportato. –

2

Per duplicare la funzione SQL ROW_NUMBER Windowing, è necessario ordinare il set di dati da sia le PARTITION e ORDER BY clausole. In una fase di dati successiva, SET il set di dati ordinati solo dalle variabili di partizione e utilizzare il controllo di variabile automatico FIRST. assegnare la nuova variabile numero di riga.

Ecco una soluzione per il tuo esempio dichiarato:

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; 

Avviso la dichiarazione BY nella fase dati corrisponde alla clausola PARTITION BY in ANSI SQL ma il passo PROC SORT smista anche dalle colonne nella clausola ORDER BY. Si noti inoltre che se la query che si sta "migrando" contiene una clausola SQL ORDER BY, è necessario eseguire questa operazione con un altro passaggio PROC SORT.

Problemi correlati