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.