PROC SQL: Fortlaufende Zeilennummern

Aus BI-Snippets - Business Intelligence Code und Module
Wechseln zu: Navigation, Suche

Fortlaufende Zeilennummern mit PROC SQL

Die automatische Variable _N_ des DATA Steps zählt die Anzahl der DATA Step Durchläufe bei dessen Ausführung. Sie wird gerne zur fortlaufenden Nummerierung der Zeilen in den Ausgabedatasets, als auch der Einschränkung bei Top X Analysen verwendet. Leider steht die Variable _N_ nicht in der PROC SQL Prozedur zu Verfügung.

Die undokumentierte PROC SQL Funktion MONOTONIC() stellt allerdings eine ähnliche Funktionalität zur Verfügung.

Zunächst erstellen wir uns Testdaten: <syntaxhighlight lang="SAS" line="1" > data work.kunden;

 do kunden_id = 1 to 100;
   alter = ceil (ranuni(0) * 100);
   output;
 end;

run; </syntaxhighlight> Und hier das SAS Beispiel: <syntaxhighlight lang="SAS" line="1" >proc sql;

 select monotonic() as lfdnr
       ,k.*
 from kunden k
 where monotonic() le 10

quit; </syntaxhighlight> SAS Output <syntaxhighlight lang="SAS" line="1" >

             The SAS System       13:01 Monday, December 16, 2013   1
        lfdnr  kunden_id     alter
     -------------------------------
            1          1        51
            2          2        55
            3          3        14
            4          4         7
            5          5        36
            6          6         3
            7          7        61
            8          8        19
            9          9        89
           10         10        82


</syntaxhighlight>


Vorsicht bei MONOTONIC() in Verbindung mit Subselect

Wenn MONOTONIC() als Ersatz für den Befehl Row_Number() verwendet werden soll ist besondere Vorsicht bei der Arbeit in Sub-Selects geboten. In diesem Beispiel soll der Datensatz im Subselect um die in der Zieltabelle
schon bekannten ID's verkleinert werden: 
<syntaxhighlight lang="SAS" line="1" > PROC SQL;

 SELECT 
  Teilnehmer_ID + MONOTONIC() AS Teilnehmer_ID
, MONOTONIC()
, innen.MO
 FROM(
  SELECT
    new.ID_Original
  , MONOTONIC() AS MO
  FROM Datenquelle new
  LEFT OUTER JOIN Zieltabelle old
    ON new.ID_Original = old.ID_Original
  WHERE old.ID_Original IS NULL
) AS innen;

RUN;</syntaxhighlight> Erwarten würde ich einen Row_Count von 1 - N im inneren Select und einen davon abweichenden Row Count im äußeren Select Statement.
Tatsächlicher aber behält die MONOTONIC() Funktion aber den Row Count aus dem Inneren Select.

SAS Output:

Teilnehmer_ID Row_Number_außen Row_Number_innen
13 4 4
14 5 5
15 6 6
16 7 7
17 8 8