Selektion nach Datum
Hallo,
ich bearbeite eine Datenbank mit Bestelldatensätzen. Ich möchte für jeden Kunden eine spezielle Selektion vornehmen. Und zwar gibt es für jeden Kunden ein anderes Datum, an dem er durch eine bestimmte Aktion bestellt hat (dieses Datum kann ich herausfiltern->datfac_begin). Ich möchte nun alle Folgebestellungen des Kunden herausfiltern, die nach diesem jeweiligen bestimmten Datum bestellt haben. Wie bekomm ich das hin?
Das hier funktioniert leider nicht...
Erläuterung:
clicli = Kundennummer
datfac = Bestelldatum
proc sort data=fbest_merge;
by clicli datfac;
run;
data ab_ap109;
set fbest_merge;
ap1=upcase(substr(actioncomcalc,1,7));
if ap1='2009AP1' then do;
*datfac_begin=put(datfac,ddmmyy10.);
datfac_begin=datfac;
end;
run;
data ab_ap109;
retain db 0;
set ab_ap109;
by clicli;
if first.clicli then db=0;
db=db+1;
run;
data test;
set ab_ap109;
by clicli;
if first.clicli then do;
if datfac_begin ne . then do;
datfac_test=datfac;
if datfac>=datfac_test;
end;
end;
run;
Liebe Geüße, Judith
- Anmelden oder Registrieren um Kommentare zu schreiben

Mit Merge das Datum zuspielen
Hallo Judith,
versuche es doch mal so:
BY clicli datfac;
RUN;
/* Raussuchen des Beginns je Kundennummer */
DATA ab_ap109;
KEEP CliCli datfac;
RENAME datfac = datfac_begin;
SET fbest_merge;
WHERE UPCASE(SUBSTR(actioncomcalc,1,7)) = '2009AP1';
RUN;
/* Dieser Schritt ist nur nötig,
wenn Kundennummern noch mehrfach vorkommen
Es wird der älteste Datensatz rausgesucht
*/
PROC MEANS DATA = ab_ap109 NOPRINT;
BY CliCli;
VAR datfac_begin;
OUTPUT OUT = ab_ap109 MIN=;
RUN;
/* Die Datensätze raussuchen */
DATA Ergebnis;
MERGE FBest_Merge ab_ap109 ;
BY CliCli;
IF NOT MISSING(datfac_begin) /* Es gibt einen Startdatensatz
für die Kundennummer */
AND datfac_begin <= datfac; /* und er ist älter oder gleich alt*/
RUN;
Der Fehler von Dir steckt in
set ab_ap109;
by clicli;
if first.clicli then do;
/* Nur der erste Datensatz einer Kundennummer*/
if datfac_begin ne . then do;
/* der gleichzeitig der Beginn des Zählens ist. */
/* In datfac_begin sollte nur in einem Datensatz je Kundennumer */
/* ein Wert stehen. Alle anderen enthalten Missings */
datfac_test=datfac;
if datfac>=datfac_test;
end;
end;
run;
/* Du meintest wahrscheinlich */
data test;
retain datfac_test;
set ab_ap109;
by clicli datfac;
if first.clicli then do;
datfac_test=.;
end;
if not missing(datfac_begin) then do;
datfac_test=datfac;
end;
if not missing(datfac_test) then output;
run;
Schöne Grüße
Jan
Hey Jan, vielen Dank für
Hey Jan,
vielen Dank für deine Hilfe! Es hat geklappt und es ist genau das was ich wollte...und ich hab mir den ganzen gestrigen Tag meinen Kopf zerbrochen! Manchmal steh ich echt auf 'n Schlauch!
Danke, danke, danke:)
LG, Judith
Hallo Judith, es wäre
Hallo Judith,
es wäre nützlich, wenn du uns auch mitteilst, was an deinen Programmen nicht funktioniert: Syntaxfehler, unerwartetes Ergebnis etc.
Es ist mühsam sich das ohne die Daten und Kenntnis deren Aufbaus herzuleiten. Ein kleiner minimalistischer Beispieldatensatz mit ein paar Sätzen und den relevanten Variablen ist auch nicht schlecht. Und gerne den Code in < sascode > < /sascode > (ohne Leerzeichen) einschließen, das erhöht die Lesbarkeit ungemein.
Viele Grüße
Simon