Zurück zur Artikelliste Artikel
4 Leseminuten

Beispiel für SQL-Fensterfunktionen mit Erklärungen

Interessiert es Sie, wie Fensterfunktionen funktionieren? Blättern Sie nach unten, um unser SQL-Fensterfunktionsbeispiel mit definitiven Erklärungen zu sehen!

SQL-Fensterfunktionen sind ein wenig anders; sie berechnen ihr Ergebnis auf der Grundlage einer Satz von Zeilen und nicht auf einer einzelnen Zeile. Tatsächlich bezieht sich das "Fenster" in "Fensterfunktion" auf diese Gruppe von Zeilen.

Fensterfunktionen ähneln den Aggregatfunktionen, aber es gibt einen wichtigen Unterschied. Wenn wir Aggregatfunktionen mit der GROUP BY Klausel verwenden, "verlieren" wir die einzelnen Zeilen. Es ist nicht möglich, Attribute aus einer einzelnen Zeile mit den Ergebnissen einer Aggregatfunktion zu mischen; die Funktion wird für die Zeilen als ganze Gruppe ausgeführt. Dies ist nicht der Fall, wenn wir SQL-Fensterfunktionen verwenden: Wir können eine Ergebnismenge mit einigen Attributen einer einzelnen Zeile zusammen mit den Ergebnissen der Fensterfunktion erzeugen. Dies sollten sich neue SQL-Entwickler vor Augen halten. Schauen wir uns also ein einfaches Beispiel für eine SQL-Fensterfunktion in Aktion an.

Möchten Sie SQL-Fensterfunktionen lernen? Besuchen Sie unseren interaktiven Fensterfunktionen Kurs!

Beispiel für eine SQL-Fensterfunktion

Fensterfunktionen können in der SELECT Anweisung oder in der ORDER BY Klausel aufgerufen werden. Sie können jedoch niemals in der WHERE Klausel aufgerufen werden. Sie werden feststellen, dass alle Beispiele in diesem Artikel die Fensterfunktion in der SELECT Spaltenliste aufrufen.

Betrachten wir das erste Beispiel für eine SQL-Fensterfunktion. Wir verwenden die "Employee" Tabelle:

employee_id full_name department salary
100 Mary Johns SALES 1000.00
101 Sean Moldy IT 1500.00
102 Peter Dugan SALES 2000.00
103 Lilian Penn SALES 1700.00
104 Milton Kowarsky IT 1800.00
105 Mareen Bisset ACCOUNTS 1200.00
106 Airton Graue ACCOUNTS 1100.00

Wir beginnen mit RANKdie eines der einfachsten Beispiele für SQL-Fensterfunktionen ist. Sie gibt die Position einer beliebigen Zeile innerhalb der Partition zurück. Benutzen wir sie, um die Gehälter innerhalb der Abteilungen zu ordnen:

SELECT	
		RANK() OVER (PARTITION BY department ORDER BY salary DESC) 
			AS dept_ranking,
		department,
		employee_id, 
		full_name, 
		salary
FROM employee;

Die Ergebnisse sind unten zu sehen:

Was ist, wenn wir den gleichen Bericht haben wollen, aber mit allen Angestellten, die an erster Stelle stehen, dann alle Angestellten, die an zweiter Stelle stehen, und so weiter? Nun, wir geben Ihnen diese Aufgabe, damit Sie selbst eine Lösung finden. Teilen Sie Ihre Ideen im Kommentarbereich mit!

Fahren wir mit unserem Beispiel für die SQL-Fensterfunktion fort und finden wir heraus, wo das Gehalt eines jeden Mitarbeiters im Verhältnis zum höchsten Gehalt seiner Abteilung steht. Dazu ist ein mathematischer Ausdruck erforderlich, etwa wie folgt:

Mitarbeiter_Gehalt / max_Gehalt_in_Tiefe

Die nächste Abfrage zeigt alle Mitarbeiter, geordnet nach der obigen Metrik; die Mitarbeiter mit dem niedrigsten Gehalt (im Verhältnis zum höchsten Abteilungsgehalt) werden zuerst aufgeführt:

SELECT
  employee_id, 
  full_name, 
  department,
  salary,
  salary / MAX(salary) OVER (PARTITION BY department ORDER BY salary DESC) 
    AS salary_metric
FROM employee
ORDER BY 5;

Möchten Sie SQL-Fensterfunktionen lernen? Probieren Sie unseren interaktiven Fensterfunktionen Kurs!

Ein weiteres Beispiel für eine SQL-Fensterfunktion

Wechseln wir von einer Datenbank mit den Gehältern der Mitarbeiter zur folgenden Datenbank mit den Zugfahrplänen:

Train_id Station Time
110 San Francisco 10:00:00
110 Redwood City 10:54:00
110 Palo Alto 11:02:00
110 San Jose 12:35:00
120 San Francisco 11:00:00
120 Redwood City Non Stop
120 Palo Alto 12:49:00
120 San Jose 13:30:00

Nehmen wir an, wir wollen eine neue Spalte mit der Bezeichnung "Zeit bis zum nächsten Bahnhof" hinzufügen. Um diesen Wert zu erhalten, subtrahieren wir die Stationszeiten für Paare von zusammenhängenden Stationen. Wir können diesen Wert berechnen, ohne eine SQL-Fensterfunktion zu verwenden, aber das kann sehr kompliziert sein. Einfacher ist es, den Wert mit der Funktion LEAD Fensterfunktion. Diese Funktion vergleicht die Werte einer Zeile mit denen der nächsten Zeile, um ein Ergebnis zu erhalten. In diesem Fall vergleicht sie die Werte in den Zeilen "Zeit" Spalte für eine Station mit der unmittelbar folgenden Station.

Hier haben wir also ein weiteres Beispiel für eine SQL-Fensterfunktion, dieses Mal für den Zugfahrplan:

SELECT 
	train_id, 
	station,
	time as "station_time",
	lead(time) OVER (PARTITION BY train_id ORDER BY time) - time 
		AS time_to_next_station
FROM train_schedule;

Beachten Sie, dass wir die LEAD Fensterfunktion mit Hilfe eines Ausdrucks, der eine einzelne Spalte und einer Fensterfunktion; dies ist bei Aggregatfunktionen nicht möglich.

Hier sind die Ergebnisse dieser Abfrage:

Im nächsten Beispiel fügen wir eine neue Spalte hinzu, die anzeigt, wie viel Zeit vom ersten Halt des Zuges bis zum aktuellen Bahnhof verstrichen ist. Wir nennen sie "verstrichene Reisezeit". Mit der Fensterfunktion MIN wird die Startzeit der Reise ermittelt und die aktuelle Bahnhofszeit abgezogen. Hier ist das nächste Beispiel für eine SQL-Fensterfunktion

SELECT 	
	train_id, 
	station,
	time as "station_time",
	time - min(time) OVER (PARTITION BY train_id ORDER BY time) 	
								AS elapsed_travel_time,
	lead(time) OVER (PARTITION BY train_id ORDER BY time) - time 
								AS time_to_next_station
FROM train_schedule;

Beachten Sie die neue Spalte in der Ergebnistabelle:

Entdecken Sie weitere Beispiele für SQL-Fensterfunktionen!

Fensterfunktionen sind keine bekannten Aspekte von SQL, aber ihre Leistungsfähigkeit und Flexibilität machen sie sehr wichtig. Es gibt Klauseln (z.B. PARTITION BY und window frame) und Themen, die wir in diesem Artikel nicht behandelt haben, aber lassen Sie sich davon nicht abhalten! Sie können mehr erfahren und weitere Beispiele für SQL-Fensterfunktionen finden, indem Sie Unser Blog und der Fensterfunktionen Kurs in LearnSQL.de. Beginnen Sie noch heute!