Ansicht
Dokumentation

ABAPSELECT_OVER - SELECT OVER

ABAPSELECT_OVER - SELECT OVER

ROGBILLS - Synchronize billing plans   General Material Data  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- sql_win

... win_func OVER( $[PARTITION sql_exp1, sql_exp2 ...$]
                   $[ORDER BY col1 $[ASCENDING$|DESCENDING$],
                             col2 $[ASCENDING$|DESCENDING$]
                         $[ROWS BETWEEN ${UNBOUNDED PRECEDING$}
                                      $|${CURRENT ROW$}
                                      $|${(n) PRECEDING$}
                                      $|${(n) FOLLOWING$}
                               AND     ${UNBOUNDED FOLLOWING$}
                                      $|${CURRENT ROW$}
                                      $|${(n) PRECEDING$}
                                      $|${(n) FOLLOWING$}$]$] ) ...


Zusätze:

1. ... ORDER BY col1 $[ASCENDING$|DESCENDING$], col2 $[ASCENDING$|DESCENDING$], ...

2. ... ROWS BETWEEN ...

Wirkung

Fensterausdruck in . Ein Fensterausdruck bestimmt über eine Fensterfunktion aus den Zeilen eines Fensters der Ergebnismenge einer Query einen einzelnen Wert. Ein Fensterausdruck kann als SQL-Ausdruck oder als Argument eines beliebigen SQL-Ausdrucks zur Definition einer Spalte col_spec der Ergebnismenge in der SELECT-Liste einer Query angegeben werden. Falls Interesse an Aggregation und Fenstern in der gleichen Abfrage besteht, können auch Aggregatsausdrücke geschachtelt werden. Das Ergebnis der Berechnung wird in jeder Zeile der Ergebnismenge in die dadurch definierte Spalte gestellt.

Ein Fensterausdruck besteht aus einer Fensterfunktion win_func gefolgt vom Zusatz OVER( ... ) in dessen runden Klammern das Fenster auf der Ergebnismenge definiert wird, für dessen Zeilen die Fensterfunktion ausgewertet wird:

Der optionale Zusatz PARTITION definiert die Fenster durch eine kommaseparierte Liste von SQL-Ausdrücken sql_exp1, sql_exp2, ... . Ein Fenster wird durch die Zeilen der Ergebnismenge gebildet, für welche alle SQL-Ausdrücken das gleiche Ergebnis haben. Es können alle SQL-Ausdrücke außer Aggregat- und Fensterausdrücken verwendet werden. Die Fensterfunktion wird für die Zeilen des jeweils aktuellen Fensters berechnet. Falls PARTITION nicht angegeben ist, wird ein einziges Fenster gebildet, das alle Zeilen der Ergebnismenge umfasst.
  • ORDER BY
Der optionale Zusatz ORDER BY führt sowohl eine Ordnung als auch einen Rahmen innerhalb des aktuellen Fensters ein, welcher die Zeilen, für welche die Fensterfunktion berechnet wird, weiter einschränkt. Er ist auch Voraussetzung für bestimmte Rangfolgefunktionen.

Wenn ein Fensterausdruck in der SELECT-Liste einer SELECT-Anweisung mit GROUP BY-Klausel verwendet wird, werden die Fenster auf der zusammengefassten Ergebnisliste definiert und es können Aggregatausdrücke als Argumente der Fensterfunktionen verwendet werden. Jede Spalte die an beliebiger Stelle des Fensterausdrucks angegeben ist, muss dann auch in der GROUP BY-Klausel angegeben sein.

Hinweise

  • Ein Fensterausdruck funktioniert ähnlich wie ein Aggregatausdruck, wobei der Zusatz PARTITION die Rolle der GROUP BY-Klausel übernimmt. Im Unterschied zu Aggregatausdrücken findet aber keine Verdichtung der über PARTITION definierten Zeilen statt, sondern diese bleiben erhalten und bekommen alle den über den Fensterausdruck berechneten Wert zugewiesen.
  • Die Fensterfunktionen eines Fensterausdrucks arbeiten mit den Zeilen einer virtuellen Tabelle, welche durch die Angaben hinter OVER definiert wird. Eine Verwendung des Zusatzes ORDER BY der SELECT-Anweisung hat keinen Einfluss auf das Ergebnis eines Fensterausdrucks. Die Zeilen der Ergebnismenge können aber selbst durch Verwendung ihres Aliasnamens nach den Ergebnissen von Fensterausdrücken sortiert werden.
  • Durch die Verwendung von Fensterausdrücken in anderen SQL-Ausdrücken können Berechnungen durchgeführt werden, welche Werte der aktuellen Zeile mit den Ergebnissen von Fensterausdrücken kombinieren, wie z.B. der prozentuale Anteil einer Spalte am aktuellen Fenster oder der Abstand zum Minimal- oder Maximalwert des aktuellen Fensters.
  • Fensterausdrücke werden nicht von allen Datenbanken unterstützt. Mit der Methode USE_FEATURES der Klasse CL_ABAP_DBFEATURES kann in einem ABAP-Programm festgestellt werden, ob das aktuelle Datenbanksystem oder ein Datenbanksystem, auf das über eine Sekundärverbindung zugegriffen wird, die Verwendung von Fensterausdrücken unterstützt. Hierzu muss die Konstante WINDOWING dieser Klasse in einer internen Tabelle an die Methode übergeben werden.

Zusatz 1

... ORDER BY col1 $[ASCENDING$|DESCENDING$], col2 $[ASCENDING$|DESCENDING$], ...

Wirkung

Der optionale Zusatz ORDER BY, der unabhängig von PARTITION angegeben werden kann, definiert eine Ordnung im aktuellen Fenster und einen Auswertungsrahmen für die Fensterfunktion. Hinter ORDER BY wird eine kommaseparierte Liste von Spalten der Datenquellen der aktuellen Query angegeben, nach denen die Zeilen des Fensters sortiert werden. Die Angabe einer Spalte ist nur direkt über die Spaltenbezeichner col1, col2 ... möglich. Mit AS definierte Aliasnamen können nicht angegeben werden. Die Zusätze ASCENDING und DESCENDING legen fest, ob aufsteigend bzw. absteigend nach der jeweiligen Spalte sortiert wird. Die Standardeinstellung ist ASCENDING.

Eine Festlegung der Ordnung mit ORDER BY bewirkt:

  • Die Zeilen des Fensters werden von der Fensterfunktion in der Reihenfolge bearbeitet, die durch die Sortierreihenfolge vorgegeben sind. Die Reihenfolge der Bearbeitung von Zeilen, die bezüglich des Sortierkriteriums mehrfach vorkommen, ist nicht definiert. Wenn der Zusatz ORDER BY nicht angegeben ist, gilt das für alle Zeilen des Fensters.
  • Die von der Fensterfunktion bearbeiteten Zeilen werden zusätzlich durch einen Rahmen eingeschränkt. Es werden nur die Zeilen des Fensters berücksichtigt, die in der Sortierung vor der aktuellen Zeile liegen oder die gleichen Werte in den Spalten des Sortierkriteriums haben.

Während der eingeschränkte Rahmen hauptsächlich auf die Ergebnisse von als Fensterfunktion angegebene Aggregatfunktionen wirkt, beeinflusst die Bearbeitungsreihenfolge im Wesentlichen die Rangfolgefunktionen. Für die Rangfolgefunktionen RANK und DENSE_RANK muss der Zusatz ORDER BY angegeben werden.

Hinweis

Die Definition des Fensters, der Bearbeitungsreihenfolge und des Rahmens durch ORDER BY hinter OVER ist völlig unabhängig vom Zusatz ORDER BY-Klausel der SELECT-Anweisung.

Fensterausdrücke mit Sortierung

Zusatz 2

... ROWS BETWEEN ...

Wirkung

Die Angabe eines Fensterrahmens ist ein optionaler Zusatz innerhalb der OVER( ... ORDER BY ... )-Klausel. Sie ermöglicht die Definition einer Untermenge von Zeilen innerhalb eines Fenster, auch Rahmen genannt. Rahmen werden mit Bezug zur aktuellen Zeile bestimmt und können daher innerhalb eines Fensters umgezogen werden.

Ein Rahmen wird durch seine Startgrenze und seine Endgrenze definiert. Diese Start- und Endgrenze können eine von drei Optionen haben:

  • ${UNBOUNDED PRECEDING$}/${UNBOUNDED FOLLOWING$}
Mit UNBOUNDED PRECEDING als Startgrenze startet der Rahmen bei der ersten Zeile des Fensters.
Mit UNBOUNDED FOLLOWING als Endgrenze endet der Rahmen bei der letzten Zeile des Fensters.
  • CURRENT ROW kann sowohl als Start- als auch Endgrenze verwendet werden. Mit dieser Angabe startet oder endet das Fenster bei der aktuellen Zeile einschließlich der aktuellen Zeile im Rahmen.
  • ${(n) PRECEDING$}/${(n) FOLLOWING$}
(n) PRECEDING kann sowohl als Start- als auch Endgrenze verwendet werden. Mit dieser Angabe startet oder endet der Rahmen n Zeilen über der aktuellen Zeile.
(n) FOLLOWING kann sowohl als Start- als auch Endgrenze verwendet werden. Mit dieser Angabe startet oder endet der Rahmen n Zeilen unter der aktuellen Zeile.
n muss 0, ein positives ganzzähliges Literal oder ein Hostausdruck sein, der in eine Konstante vom Typ b, s,i oder int8 aufgelöst wird.

ORDER BY ist eine Mussangabe.

Hinweise

  • Die Endgrenze des Rahmens darf nicht kleiner als die Startgrenze sein.
  • Ohne Verwendung eines Fensterrahmens ist der Standardfensterrahmen BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Das heißt, die Fensterfunktion berechnet alle Zeilen bis zur aktuellen Zeile. Die Funktion gibt kumulative Werte als Ergebnis zurück .

Beispiel

Das Beispiel demonstriert die Anwendung verschiedener Fensterfunktionen auf Rahmen innerhalb eines Fensters.

  • Mit count werden die Zeilen nach der Spalte ID sortiert und die Anzahl Zeilen ab der ersten Zeile des Fensters bis zur aktuellen Zeile gezählt. Dabei wird das gleich Ergebnis wie bei der ROW_NUMBER( )-Funktion zurückgegeben.
  • Mit count_reverse werden die Zeilen nach der Spalte ID sortiert und die Anzahl Zeilen ab der aktuellen Zeile bis zur letzten Zeile des Fensters gezählt. Dies ergibt eine umgekehrte Nummerierung.
  • Mit average werden die Zeilen nach der Spalte ID sortiert und die gleitende Mittelwerte einer Untermenge Zeilen aus der Spalte COL1 berechnet. Diese Untermenge besteht aus der aktuellen Zeile und einer vorhergehenden Zeile und einer folgenden Zeile. Mit dieser Funktion kann man beispielsweise für jeden Tag die Durchschnittstemperatur über 3 Tage aus einer Liste von Temperaturdaten.
  • Mit accumulate werden die Zeilen nach der Spalte ID sortiert und die Werte aus der ersten Zeile des Fensters bis zur aktuellen Zeile kumuliert. Damit wird die laufende Summe der Spalte COL1 berechnet.

Angabe eines Fensterrahmens






CL_GUI_FRONTEND_SERVICES - Frontend Services   SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 17642 Date: 20240523 Time: 134440     sap01-206 ( 216 ms )