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:
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.