proc sql;... overover( partition .. ) in SAS
Hallo,
ich lasse SQL Programme in SAS laufen, was bis jetzt mit wenigen Modifikationen recht einfach ist. Leider weiß ich nicht viel mit dem Befehl "OVER" in SQL anzufangen, und kann ihn deshalb auch nicht in SAS übersetzten.
Hat jemand eine Ahnung, wie ich diese Syntax in SAS umschreibe?
CREATE table XX SELECT
A
,row_number() over( partition by A, B order by C asc) as D
Das Log, wenn ich das "over" einfach übernehme:
FEHLER 22-322: Syntaxfehler, erwartet wird eines der folgenden: !, !!, &, *, **,
+, ',', -, /, <, <=, <>, =, >, >=, ?, AND, BETWEEN, CONTAINS, EQ,EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=.
FEHLER 76-322: Syntaxfehler, Anweisung wird ignoriert.
Liebe Grüße und Danke
- Anmelden oder Registrieren um Kommentare zu schreiben

Transact-SQL
Hallo Erika,
dies ist eine Erweiterung von SQL aus Transact-SQL. Informationen darüber was diese Zeile macht, findest du bei Microsoft Transact-Sql Referenz.
Dieser Befehl generiert eine laufende Nummer, beginnend bei 1 für jede Gruppe von A, B und sortiert nach C. In SAS-SQL wird du dies nicht umsetzen können. Allerdings ist es möglich, dies im Datastep zu machen.
by A B C;
run;
Data XX;
keep A D;
set yy;
by A B;
if first.B then D = 1;
else D + 1;
run;
Schöne Grüße
Jan
Danke
Hat funktioniert, danke...Data Step ist doch der Beste!!
In SAS-SQL gibt es die
In SAS-SQL gibt es die undokumentierte Funktion Monotonic().
Diese gibt die Zeilenzahl aus.
-es müßte also ohne DATA STEP gehen?!
Hallo Muschik, die Funktion
Hallo Muschik,
die Funktion Monotonic() kannte ich bisher nicht, ich habe aber schon viele Male die Möglichkeit, eine laufende Nummer mit SQL zu erzeugen, vermisst.
Es stimmt, es geht auch ohne Data Step.
CREATE TABLE t1 AS
SELECT * FROM sashelp.class ORDER BY sex, age, name;
CREATE TABLE t2 AS
SELECT sex
, age
, monotonic(name) - MIN(monotonic(name)) + 1 AS lfdnr
, name
FROM t1
GROUP BY sex
, age
;
QUIT;
Dieser Code liefert eine laufende Nummer für jede Gruppe Sex, Age sortiert nach Name.
Ersetzt man das CREATE TABLE t1 Statement durch CREATE VIEW t1, bekommt man nicht mehr das richtige Ergebnis. Offensichtlich wird das Sortieren im View wegoptimiert, denn das Ergebnis ist dasselbe, wie wenn man die Routine auf unsortierte Daten anwendet.
Auf das Optimieren und die letztendliche Ausführung hat man allerdings wenig Einfluss. Außerdem kann die Ausführung des SQL-Statements auch von Version zu Version wechseln und es ist immer ungewiss, in welcher Reihenfolge man in SQL die Daten geliefert bekommt.
Ich sehe in diesem Fall keinen Vorteil darin, SQL zu verwenden, da ich weiterhin eine temporäre sortierte Zwischentabelle erzeugen muss, und würde hier den Data Step verwenden.
Schöne Grüße
Jan