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:
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.