Bei der Datenexploration oder beim Debugging möchte man häufig nur das "Ende" einer Tabelle (Datensatz) isolieren. Im Gegensatz zur Option OBS=10, die uns den Anfang gibt, erfordert das Abrufen der letzten 10 Beobachtungen einer Tabelle mit $N$ Zeilen einen durchdachteren Ansatz, insbesondere wenn die Tabelle groß ist.
Note : Der naive Ansatz (absteigende Sortierung)
Die erste Idee, die oft in den Sinn kommt, ist, die Tabelle in umgekehrter chronologischer Reihenfolge zu sortieren und die ersten Zeilen zu nehmen.
proc sort data=MA_TABLE out=sorted_table;
by descending date_variable;
run;
data last_ten;
set sorted_table (obs=10);
run;
1
PROC SORTDATA=MA_TABLE out=sorted_table;
2
BY descending date_variable;
3
RUN;
4
5
DATA last_ten;
6
SET sorted_table (obs=10);
7
RUN;
Urteil: Bei großen Tabellen vermeiden.
Warum? Das Sortieren einer Tabelle mit Millionen von Zeilen verbraucht enorm viele CPU- und E/A-Ressourcen, nur um 10 Zeilen zu lesen. Das ist ineffizient.
Note : Der arithmetische Ansatz (NOBS und IF)
Eine viel sauberere Methode besteht darin, die Option NOBS in der SET-Anweisung zu verwenden. Diese Option speichert die Gesamtzahl der Beobachtungen in einer temporären Variable während der Kompilierung, ohne die Tabelle lesen zu müssen.
data last_ten;
set MA_TABLE nobs=total_obs;
/* On ne garde que si le numéro de ligne (_N_) est dans les 10 derniers */
if _N_ > (total_obs - 10);
run;
1
DATA last_ten;
2
SET MA_TABLE nobs=total_obs;
3
/* On ne garde que si le numéro de ligne (_N_) est dans les 10 derniers */
Note : Der Hochleistungsansatz (Direktzugriff mit POINT=)
Dies ist die von Experten empfohlene optimale Lösung. Ziel ist es, den Direktzugriff (Direct Access) zu nutzen, um direkt zum Ende der Datei zu springen, ohne den Anfang zu lesen.
Wir kombinieren NOBS (um das Ende zu kennen) und POINT (um zu einer bestimmten Zeile zu gehen).
data last_ten;
/* Boucle de la ligne N-9 jusqu'à la ligne N */
do i = (total_obs - 9) to total_obs;
set MA_TABLE nobs=total_obs point=i;
output;
end;
stop; /* IMPORTANT : stop évite une boucle infinie avec l'instruction POINT */
run;
1
DATA last_ten;
2
/* Boucle de la ligne N-9 jusqu'à la ligne N */
3
DO i = (total_obs - 9) to total_obs;
4
SET MA_TABLE nobs=total_obs point=i;
5
OUTPUT;
6
END;
7
stop; /* IMPORTANT : stop évite une boucle infinie avec l'instruction POINT */
Technische Anmerkung: Die STOP-Anweisung ist obligatorisch, da die SET-Anweisung mit POINT= niemals auf einen End-of-File-Marker trifft.
Note : Der Makro-Ansatz (dynamisches FIRSTOBS)
Eine interessante Alternative besteht darin, den Startpunkt in einem vorherigen Schritt zu berechnen und dann die Option FIRSTOBS zu verwenden.
/* Étape 1 : Calculer le point de départ */
data _null_;
set MA_TABLE nobs=n;
start_point = n - 9;
call symput('start_obs', start_point);
run;
/* Étape 2 : Lire à partir de ce point */
data last_ten;
set MA_TABLE (firstobs=&start_obs);
run;
1
/* Étape 1 : Calculer le point de départ */
2
DATA _null_;
3
SET MA_TABLE nobs=n;
4
start_point = n - 9;
5
call symput('start_obs', start_point);
6
RUN;
7
8
/* Étape 2 : Lire à partir de ce point */
9
DATA last_ten;
10
SET MA_TABLE (firstobs=&start_obs);
11
RUN;
Urteil: Funktional, aber wortreich. Methode 3 bleibt überlegen, da sie in einem einzigen Data-Schritt enthalten ist.
Punkte zur Beachtung und Einschränkungen
Zusammenfassend sind hier einige technische Nuancen, die in der Diskussion angesprochen wurden:
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.