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:
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.