logo

Fensterfunktionen in SQL

Fensterfunktionen gelten für Aggregations- und Rangfolgefunktionen über ein bestimmtes Fenster (Zeilensatz). Die OVER-Klausel wird mit Fensterfunktionen verwendet, um dieses Fenster zu definieren. Die OVER-Klausel bewirkt zwei Dinge:

Java-Switch-Gehäuse
  • Partitioniert Zeilen, um eine Reihe von Zeilen zu bilden. (PARTITION BY-Klausel wird verwendet)
  • Ordnet Zeilen innerhalb dieser Partitionen in einer bestimmten Reihenfolge an. (ORDER BY-Klausel wird verwendet)

Notiz: Wenn keine Partitionen durchgeführt werden, ordnet ORDER BY alle Zeilen der Tabelle.

Syntax:



SELECT coulmn_name1,   window_function(cloumn_name2)  OVER([PARTITION BY column_name1] [ORDER BY column_name3]) AS new_column FROM table_name;       window_function=   any aggregate or ranking function    column_name1  = column to be selected   coulmn_name2=   column on which window function is to be applied   column_name3  = column on whose basis partition of rows is to be done   new_column=   Name of new column   table_name=   Name of table>

Funktion „Fenster aggregieren“.
Verschiedene Aggregatfunktionen wie SUM(), COUNT(), AVERAGE(), MAX() und MIN(), die auf ein bestimmtes Fenster (Zeilensatz) angewendet werden, werden als Aggregatfensterfunktionen bezeichnet.

Folgendes berücksichtigen Mitarbeiter Tisch :

Java in Scheiben schneiden
Name Alter Abteilung Gehalt
Ramesh zwanzig Finanzen 50.000
Tief 25 Verkäufe 30.000
Suresh 22 Finanzen 50000
RAM 28 Finanzen 20.000
Pradeep 22 Verkäufe 20.000

Beispiel -
Finden Sie das Durchschnittsgehalt der Mitarbeiter für jede Abteilung und ordnen Sie die Mitarbeiter innerhalb einer Abteilung nach Alter.

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

Dies gibt Folgendes aus:

Name Alter Abteilung Gehalt Avg_Salary
Ramesh zwanzig Finanzen 50.000 40.000
Suresh 22 Finanzen 50.000 40.000
RAM 28 Finanzen 20.000 40.000
Tief 25 Verkäufe 30.000 25.000
Pradeep 22 Verkäufe 20.000 25.000

Beachten Sie, dass alle Durchschnittsgehälter in einem bestimmten Fenster den gleichen Wert haben.

Betrachten wir einen anderen Fall:

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary  FROM employee>

Hier ordnen wir die Datensätze innerhalb der Partition auch nach Alterswerten und daher ändern sich die Durchschnittswerte entsprechend der sortierten Reihenfolge.
Die Ausgabe der obigen Abfrage ist:

uri vs. url
Name Alter Abteilung Gehalt Avg_Salary
Ramesh zwanzig Finanzen 50.000 50.000
Suresh 22 Finanzen 50.000 50.000
RAM 28 Finanzen 20.000 40.000
Pradeep 22 Verkäufe 20.000 20.000
Tief 25 Verkäufe 30.000 25.000

Daher sollten wir beim Hinzufügen von order by-Klauseln zu Fensterfunktionen mit Aggregaten vorsichtig sein.

Funktionen des Ranking-Fensters:
Ranking-Funktionen sind RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANK() –
    Wie der Name schon sagt, weist die Rangfunktion allen Zeilen innerhalb jeder Partition einen Rang zu. Der Rang wird so zugewiesen, dass der ersten Zeile der Rang 1 zugewiesen wird und Zeilen mit demselben Wert den gleichen Rang erhalten. Für den nächsten Rang nach zwei gleichen Rangwerten wird ein Rangwert übersprungen. Wenn beispielsweise zwei Zeilen den Rang 1 teilen, erhält die nächste Zeile den Rang 3 und nicht den Rang 2.
  • DENSE_RANK() –
    Es weist jeder Zeile innerhalb der Partition einen Rang zu. Genau wie bei der Rangfunktion wird der ersten Zeile Rang 1 zugewiesen und Zeilen mit demselben Wert haben denselben Rang. Der Unterschied zwischen RANK() und DENSE_RANK() besteht darin, dass in DENSE_RANK() für den nächsten Rang nach zwei gleichen Rängen aufeinanderfolgende Ganzzahlen verwendet werden und kein Rang übersprungen wird.
  • ZEILENNUMMER() -
    ROW_NUMBER() gibt jeder Zeile eine eindeutige Nummer. Es nummeriert die Zeilen von eins bis zur Gesamtzahl der Zeilen. Die Zeilen werden basierend auf ihren Werten in Gruppen eingeteilt. Jede Gruppe wird als Partition bezeichnet. In jeder Partition erhalten die Zeilen nacheinander Nummern. In einer Partition haben keine zwei Zeilen die gleiche Nummer. Dadurch unterscheidet sich ROW_NUMBER() von RANK() und DENSE_RANK(). ROW_NUMBER() identifiziert jede Zeile eindeutig mit einer fortlaufenden Ganzzahl. Dies hilft bei verschiedenen Arten der Datenanalyse.

Notiz -
ORDER BY() sollte bei der Verwendung von Rangfensterfunktionen zwingend angegeben werden.

Java-Datenbank jdbc

Beispiel -
Berechnen Sie die Zeilennummer, den Rang und die dichte Rangfolge der Mitarbeiter in der Mitarbeitertabelle entsprechend dem Gehalt in jeder Abteilung.

SELECT   ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS emp_row_no,   Name,   Department,   Salary,  RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_rank,  DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_dense_rank FROM   employee;>

Die Ausgabe der obigen Abfrage ist:

emp_row_no Name Abteilung Gehalt emp_rank emp_dense_rank
1 Ramesh Finanzen 50.000 1 1
2 Suresh Finanzen 50.000 1 1
3 RAM Finanzen 20.000 3 2
1 Tief Verkäufe 30.000 1 1
2 Pradeep Verkäufe 20.000 2 2

Wir können also sehen, dass, wie in der Definition von ROW_NUMBER() erwähnt, die Zeilennummern innerhalb jeder Partition aufeinanderfolgende ganze Zahlen sind. Außerdem können wir den Unterschied zwischen Rang und dichtem Rang darin erkennen, dass es bei dichtem Rang keine Lücke zwischen den Rangwerten gibt, während es nach wiederholtem Rang eine Lücke in den Rangwerten gibt.