Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfrage und Änderung von Daten » OLAP-Unterstützung » Fensterfunktionen

 

Fensterdefinitionen

Sie können die SQL-Fenstererweiterungen verwenden, um die Grenzen eines Fensters und die Partitionierung und Reihenfolge der Eingabezeilen zu konfigurieren. Logischerweise werden, im Rahmen der Semantik der Ergebnisberechnung einer Abfragespezifikation, die Partitionen erstellt, nachdem die durch die GROUP BY-Klausel definierten Gruppen erstellt wurden, jedoch vor der Auswertung der endgültigen SELECT-Liste und der ORDER BY-Klausel der Abfrage. Die Reihenfolge der Auswertung der Klauseln in einer SQL-Anweisung lautet:

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. WINDOW

  6. DISTINCT

  7. ORDER BY

Wenn Sie Ihre Abfrage formulieren, sollten Sie die Auswirkung der Reihenfolge der Auflösung berücksichtigen. Es darf beispielsweise kein Prädikat für einen Ausdruck, der eine Fensterfunktion referenziert, in demselben SELECT-Abfrageblock verwendet werden. Wenn Sie allerdings den Abfrageblock in eine abgeleitete Tabelle platzieren, können Sie ein Prädikat für die abgeleitete Tabelle angeben. Die folgende Abfrage schlägt mit einer Meldung fehl, die angibt, dass der Fehler von einem Prädikat verursacht wurde, das für eine Fensterfunktion angegeben wird:



SELECT DepartmentID, Surname, StartDate, Salary,
       SUM( Salary ) OVER ( PARTITION BY DepartmentID
          ORDER BY StartDate
          RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS "Sum_Salary" 
   FROM Employees
   WHERE State IN ( 'CA', 'UT', 'NY', 'AZ' ) 
      AND DepartmentID IN ( '100', '200' )
   GROUP BY DepartmentID, Surname, StartDate, Salary
   HAVING Salary > 0 AND "Sum_Salary" > 200
   ORDER BY DepartmentID, StartDate;

Verwenden Sie eine abgeleitete Tabelle (DT, derived table) und geben Sie für sie ein Prädikat an, um die gewünschten Ergebnisse zu erhalten.



SELECT * FROM ( SELECT DepartmentID, Surname, StartDate, Salary,
                       SUM( Salary ) OVER ( PARTITION BY DepartmentID
                         ORDER BY StartDate
                         RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS "Sum_Salary"
                  FROM Employees
                  WHERE State IN ( 'CA', 'UT', 'NY', 'AZ' ) 
                     AND DepartmentID IN ( '100', '200' )
                  GROUP BY DepartmentID, Surname, StartDate, Salary
                  HAVING Salary > 0
                  ORDER BY DepartmentID, StartDate ) AS DT
   WHERE DT.Sum_Salary > 200;

Da die Fensterpartitionierung nach einem GROUP BY-Operator erfolgt, stehen die Ergebnisse aller Aggregatfunktionen wie etwa SUM, AVG oder VARIANCE den Berechnungen zur Verfügung, die für eine Partition durchgeführt werden. Fenster bieten daher eine weitere Möglichkeit, Gruppierungen und Sortierungen durchzuführen, zusätzlich zu den GROUP BY- und ORDER BY-Klauseln einer Abfrage.

 Eine Fensterspezifikation definieren