Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
New Contributor
Beiträge: 4
Filtern einer Tabelle nach dem jeweils jüngsten Datum

Hallo,

 

der Fehler mit der nicht existierenden Datei scheint behoben, trotzdem ist in der Abfrage noch ein Syntax-Error´. Habe bereits verschiedene Möglichkeiten (auch über eine weitere Abfrage, um die Sortierung zu vermeiden) ausprobiert, aber damit nur den Inhalt der Fehlermeldung geändert.

Vielleicht gibt es ja noch andere arme User, die heute keinen Feiertag haben und mir helfen können...

 

Herzlichen Dank

Florian

 

69         PROC SQL;
70            CREATE TABLE Kuend AS
71            SELECT t1.*
72               FROM FILTER_FOR_BEST_BS_HIST_0001 as t1
73               ORDER BY t1.VNR,
74                        t1.DAT_STND DESC,
75         (
76             select VNR
77             , Max(DAT_STND) as DAT_STND
78             from FILTER_FOR_BEST_BS_HIST_0001
79             group by VNR
80             ) as T2
                 __
                 22
                 202
ERROR 22-322: Syntax error, expecting one of the following: ;, !, !!, &, *, **, +, ',', -, /, <, <=, <>, =, >, >=, ?, AND, ASC, ASCENDING, BETWEEN, CONTAINS, DESC, DESCENDING, EQ, EQT, GE, GET, 
              GT, GTT, IN, IS, LE, LET, LIKE, LT, LTT, NE, NET, NOT, NOTIN, OR, ^, ^=, |, ||, ~, ~=.  

ERROR 202-322: The option or parameter is not recognized and will be ignored.

81           where T1.VNR      = T2.VNR
82             and T1.DAT_STND = T2.DAT_STND
83           ;
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
Occasional Contributor
Beiträge: 7
Betreff: Filtern einer Tabelle nach dem jeweils jüngsten Datum

Hallo Florian,

 

das Problem bei deinem SQL ist, dass du ein Subselect im ORDER BY Statement verwendest.

Jan hat gestern ein sehr gutes Beispiel dafür erklärt:

 

Proc sql;
  Create table kuend as
  select T1.*
  from FILTER_FOR_BEST_BS_HIST_0001 as T1
  , (
    select VNR
    , Max(DAT_STND) as DAT_STND
    from FILTER_FOR_BEST_BS_HIST_0001
    group by VNR
    ) as T2
  where T1.VNR      = T2.VNR
    and T1.DAT_STND = T2.DAT_STND
  ;
quit;

 

Viele Grüße

Dennis

Frequent Contributor
Beiträge: 129
Betreff: Filtern einer Tabelle nach dem jeweils jüngsten Datum

Hallo,

Vielleicht ist es besser SQL erstmal zu lassen, wenn Du es nicht verstehst. Hattest Du gestern nicht bereits die Antwort in dem ersten Post bekommen?

 

PROC SORT data=have; BY VNR DAT_STND; RUN;
DATA want;
   SET have;
   BY VNR DAT_STND;
   if last.VNR and last.DAT_STND;
RUN;
________________________

- Cheers -

Contributor
Beiträge: 24
Betreff: Filtern einer Tabelle nach dem jeweils jüngsten Datum

Hallo Florian,

dein order by Statement steht an der falschen Stelle Select-Abfragen sind immer nach dem Schema:

 

Proc SQL;
  Select <Spalten oder Ausdrücke>
  from <Sourcetabelle(n)
  where <filterbedingungen auf Source>
  group by <Gruppierungsausdrücke>
  having <Filter auf das berechnete Ergebnis>
  order by <Spalten des Ergebnisses nach dem Sortiert werden soll>
  ;
quit;

aufgebaut. In SAS sind der "Select"- und "from"-Abschnitt verpflichtend, "where", "group by", "having" und "order by" sind optional. Die Reihenfolge muss aber immer eingehalten werden.

Der Abschnitt in meinem Code ,(...) as T2 ist ein sogenannter Subselect und gehört mit zum from-Abschnitt des oberen Abschnitts. Im ersten Beispiel hatte ich den Subselect weggelassen, weil ich ihn für Dich als Anfänger verwirrend hielt. Das Ausformulieren war nur als Erläuterung gedacht, warum ich die Note nicht schlimm finde.

 

SQL habe ich nur verwendet, weil Du mit dem EG arbeitest.

Im EG kannst Du Dir Deinen SQL-Code zusammenklicken, was ich Dir auf jeden Fall erstmal empfehlen würde. Als Beispiel wie du zu Deinem Ergebnis kommst gehe ich das einmal für Dich durch.

  1. Die Tabelle auswählen und öffnen, die Du analysieren willst
  2. Abfrage erstellen anklicken
  3. Die Spalten oder die ganze Tabelle in der linken Liste in die rechte Liste unter dem Reiter "Daten auswählen" ziehen.
  4. Die Spalte Dat_stnd ein zweites Mal in die rechte Liste ziehen. Unter Spaltenname passt der EG zu Dat_stnd1 an.
  5. In der dritten Spalte "Zusammenfassung" der rechten Liste dann Max auswählen. In "Spaltenname" steht jetzt "max_of_Dat_stnd". Unter "Quellspalte" steht jetzt "berechnet". Unter der rechten Liste ist jetzt der Punkt "Gruppen automatisch auswählen" erschienen und alle anderen Spalten sind dort vorausgewählt.
  6. Den Haken bei "Gruppen automatisch auswählen" wegnehmen. Die vorausgewählten Spalten verschwinden wieder
  7. Gruppen bearbeiten anklicken
  8. Aus der Liste verfügbare Spalten VNR nach "Gruppieren nach" bewegen
  9. Zum Reiter "Daten filtern" wechseln. Die Liste "Rohdaten filtern" entspricht der "where"-Bedingung, die Liste "Zusammengefasste Daten filtern" der having-Bedingung.
  10. Bei "Zusammengefasste Daten filtern" auf den Trichter/Filter klicken und einen neuen Filter anlegen.
  11. Einfachen Filter auswählen
  12. Unter "berechnete Spalten" "Max_of_Dat_stnd" auswählen. Nach Klick auf "weiter" steht jetzt unter Quellspalte "Berechnet", unter Spaltenname "Max_of_Dat_stnd" und unter Operator "Gleich".
  13. Bei Wert auf den Pfeil rechts klicken, auf den Reiter Spalten gehen und "Dat_stnd" auswählen. Nach Klick auf "weiter" erscheint die Zusammenfassung des Filters und mit "Fertigstellen" abschließen.
  14. Zum Reiter "Daten sortieren" wechseln
  15. Die beiden Spalten "VNR" und "Dat_stnd" nach links ziehen.
  16. Unter "Vorschau" im Menü des Fensters kannst Du dir den generierten Code anschauen und dir eine Vorschau des Ergebnisses anzeigen lassen. Sollte jetzt noch irgendein Fehler im Code sein, bekommst Du eine Fehlermeldung.
  17. Je nach Deinen Einstellungen im EG wird Dir jetzt eine neue Tabelle, einen neue Sicht oder ein Report erstellt. Unter Optionen kannst Du jetzt für diese Abfrage die Voreinstellung außer Kraft setzen und eine andere Ausgabeart wählen.
  18. Dort kannst Du ebenfalls den Namen der erzeugten Tabelle oder Sicht ändern.
  19. Mit Klick auf "Ausführen" wird die Abfrage ausgeführt.

Ich gebe zu, dass der Abfrageeditor im EG nicht sonderlich intuitiv ist und man relativ viel klicken muss, aber er erzeugt korrekten Code. Im EG gibt es aber nur die Möglichkeit SQL-Code zusammenzuklicken, es ist nicht möglich "SAS-Code" mit einem Assistenten zu erstellen. Ist man fitter mit SQL lässt man den Abfrageeditor außen vor oder klickt sich nur noch das Grundgerüst zusammen, um Tippfehler zu vermeiden. Um wirklich zu verstehen, was dort geschieht muss man sich sowohl mit dem Abfrageeditor, als auch mit SQL beschäftigen. Belohnt wird man dafür mit Kenntnissen in SQL, die man in allen möglichen anderen Bereichen der Datenverarbeitung gebrauchen kann, weil das Grundgerüst der Sprache immer gleich ist, auch wenn die genaue Syntax differiert.

 

VG Jan