Zurück zur Artikelliste Artikel
15 Leseminuten

Die 10 besten SQL-Fensterfunktionen Interviewfragen

Für viele interessante Stellen sind SQL-Kenntnisse erforderlich - und dazu gehören auch die Fensterfunktionen, die in Online-Kursen normalerweise nicht gelehrt werden. In diesem Artikel gehe ich auf die wichtigsten Fragen zu Fensterfunktionen für alle Erfahrungsstufen ein.

Wenn Sie zu einem Vorstellungsgespräch für eine fortgeschrittene SQL-Stelle oder für eine mittlere bis fortgeschrittene Datenanalystenstelle gehen, werden Sie wahrscheinlich nach Ihren Kenntnissen der SQL-Fensterfunktionen gefragt. Kein Grund zur Panik! Obwohl diese Funktionen in Online-Kursen normalerweise nicht behandelt werden, haben wir hier die Antworten für Sie.

Häufige Fragen im Vorstellungsgespräch zu SQL Fensterfunktionen

Dieser Artikel soll Ihnen helfen, sich auf Fragen zu verschiedenen Unterthemen der Fensterfunktionen vorzubereiten. Wir können Ihnen nicht die genauen Fragen nennen, die Sie erhalten werden, aber wir können mit ziemlicher Sicherheit sagen, auf welche Themen sich die Fragen beziehen werden.

In manchen Fällen kann die Frage sehr offen formuliert sein, so dass es Ihnen überlassen bleibt, welches Unterthema der Fensterfunktionen Sie abdecken. In diesem Fall sollten Sie die relative Bedeutung der einzelnen Unterthemen kennen. Für den Anfang sollten Sie auf eine offene Frage wie folgende vorbereitet sein:

1. Was ist eine Fensterfunktion in SQL?

Fensterfunktionen sind SQL-Funktionen, die mit einer Gruppe von Datensätzen arbeiten, die als "Fenster" oder "Fensterrahmen" bezeichnet werden. Das "Fenster" ist ein Satz von Zeilen, die in irgendeiner Weise mit der Zeile zusammenhängen, die gerade von der Abfrage verarbeitet wird (z. B. alle Zeilen vor der aktuellen Zeile, 5 Zeilen vor der aktuellen Zeile oder 3 Zeilen nach der aktuellen Zeile).

Fensterfunktionen ähneln den Aggregatfunktionen insofern, als sie Statistiken für eine Gruppe von Zeilen berechnen. Allerdings werden bei Fensterfunktionen die Zeilen nicht komprimiert, sondern die Details der einzelnen Zeilen bleiben erhalten.

Fensterfunktionen lassen sich in die folgenden vier Kategorien einteilen: Aggregatfunktionen, Rankingfunktionen, analytische Funktionen und Verteilungsfunktionen.

Aggregatfunktionen sind die Funktionen, die Sie mit GROUP BY verwenden. Dazu gehören:

  • COUNT() Zählt die Anzahl der Zeilen innerhalb des Fensters.
  • AVG() berechnet den Durchschnittswert für eine bestimmte Spalte für alle Datensätze im Fenster.
  • MAX() ermittelt den Maximalwert einer Spalte für alle Datensätze im Fenster.
  • SUM() gibt die Summe aller Werte einer bestimmten Spalte innerhalb des Fensters zurück.

In der Kategorie Ranking:

  • ROW_NUMBER() gibt die Position der Zeile in der Ergebnismenge zurück.
  • RANK() ordnet Zeilen auf der Grundlage eines bestimmten Wertes. Wenn sich zwei Zeilen an der gleichen Position befinden, erhalten sie den gleichen Rang und die nächste Position bleibt leer (z. B. 1, 2, 3, 3, 5...).
  • DENSE_RANK() ordnet die Zeilen ebenfalls nach einem bestimmten Wert, lässt aber die nächste Position nicht leer (z. B. 1, 2, 3, 3, 4, 5...).

Ausführliche Informationen finden Sie in diesem Artikel über Rangordnungsfunktionen.

In der analytischen Kategorie ermöglichen es die Funktionen LEAD(), LAG() oder FIRST_VALUE(), Daten aus anderen Zeilen desselben Fensters zu erhalten. LEAD() liefert Werte aus Zeilen unterhalb der aktuellen Zeile; LAG() aus Zeilen oberhalb der aktuellen Zeile. Weitere Einzelheiten finden Sie in unserem Artikel über LEAD vs. LAG.

Schließlich gibt es in der Kategorie Verteilung Funktionen wie PERCENT_RANK() und CUME_DIST(), mit denen man Perzentil-Ranglisten oder kumulative Verteilungen erhalten kann. In unserem Fensterfunktionen - SQL-Online-Kurs finden Sie eine schrittweise Anleitung zur Verwendung dieser Funktionen.

Hier ist eine Beispielabfrage mit Fensterfunktionen:

SELECT
    employee_name,
    department_name,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary) position 
FROM employee

In dieser Abfrage wird die Fensterfunktion RANK() verwendet, um die Mitarbeiter nach ihrem Gehalt zu ordnen. Später in diesem Artikel werden wir die Syntax der OVER() Klausel und der PARTITION BY und ORDER BY Unterklauseln im Detail besprechen. Im Moment wird nur gesagt, dass sie verwendet werden, um zu definieren, welche Datensätze den Fensterrahmen bilden.

Einstiegsfragen zur Fensterfunktion

2. Was ist die Syntax der OVER ()-Klausel?

Die OVER() -Klausel wird verwendet, um zu definieren, welche Zeilen im Fensterrahmen enthalten sein sollen. Die folgenden Unterklauseln können in der OVER() Klausel vorhanden sein:

  • PARTITION BY definiert die Partition oder die Gruppen von Zeilen innerhalb des Fensterrahmens, die die Fensterfunktion zur Erstellung eines Ergebnisses verwendet. (Dies wird weiter unten erklärt.)
  • ORDER BY definiert die Reihenfolge der Zeilen im Fensterrahmen.
  • ROWS/RANGE definiert die obere und untere Grenze des Fensterrahmens.

Alle Unterklauseln von OVER() sind optional und können weggelassen werden. In diesem Fall werden die Funktionen für den gesamten Fensterrahmen ausgeführt.

Die folgende SQL zeigt die OVER() Klausel bei der Arbeit:

SELECT
first_name,
last_name,
department, 
salary,
AVG(salary) OVER (PARTITION BY department) 
FROM employee

Für jeden Mitarbeiter gibt die Abfrage den Vornamen, den Nachnamen, das Gehalt und das durchschnittliche Gehalt in der Abteilung zurück. Die Klausel OVER (PARTITION BY department) erstellt ein Fenster mit Zeilen für jeden Wert in der Spalte Abteilung. Alle Zeilen mit demselben Wert in der Spalte "Abteilung" gehören zu demselben Fenster. Die Funktion AVG() wird auf das Fenster angewendet: Die Abfrage berechnet das Durchschnittsgehalt in der angegebenen Abteilung.

Der Artikel Was ist die OVER-Klausel? enthält eine vollständige Erklärung der OVER -Klausel.

3. Beschreiben Sie den Unterschied zwischen Fensterfunktionen und Aggregatfunktionen.

Der Hauptunterschied zwischen Fensterfunktionen und Aggregatfunktionen besteht darin, dass Aggregatfunktionen mehrere Zeilen zu einer einzigen Ergebniszeile gruppieren; alle einzelnen Zeilen in der Gruppe werden komprimiert und ihre individuellen Daten werden nicht angezeigt. Fensterfunktionen hingegen erzeugen ein Ergebnis für jede einzelne Zeile. Dieses Ergebnis wird in der Regel als neuer Spaltenwert in jeder Zeile des Fensters angezeigt.

Das Einklappen von Zeilen ist ein wichtiges Merkmal von Aggregatfunktionen. Zum Beispiel können wir das Problem "Gib alle Mitarbeiter mit ihrem Gehalt und dem maximalen Gehalt in ihrer Abteilung zurück" mit Aggregatfunktionen aufgrund der Einschränkung des Zusammenklappens nicht lösen.

Was die Ähnlichkeit betrifft, so führen sowohl Aggregat- als auch Fensterfunktionen eine aggregatähnliche Operation an einer Gruppe von Zeilen durch. Einige Funktionen wie AVG(), MAX(), MIN(), und SUM() können sowohl als Aggregat- als auch als Fensterfunktionen verwendet werden. Wenn wir jedoch das Ergebnis dieser Funktionen in Kombination mit Daten auf Zeilenebene benötigen, ist es besser, eine Fensterfunktion anstelle einer Aggregatfunktion zu verwenden.

Wir werden zwei SQL-Abfragen zeigen, die den Abteilungsnamen und das maximale Gehalt jeder Abteilung zurückgeben. Im ersten Beispiel werden wir MAX() als Aggregatfunktion verwenden:

SELECT   department_name,
         MAX(salary) AS max_salary
FROM     employee
GROUP BY department_name

Unten sehen Sie das Ergebnis der vorherigen Abfrage. Beachten Sie, dass es aufgrund der zusammenfassenden Wirkung der GROUP BY -Klausel einen Datensatz pro Abteilung gibt:

department_namemax_salary
Accounting93000
Sales134000
Human Resources78000

Im nächsten Beispiel erhalten wir ein ähnliches, aber etwas anderes Ergebnis, indem wir MAX() als Fensterfunktion verwenden:

SELECT employee_name, 
       salary,
       department_name,
       MAX(salary) OVER (PARTITION BY department_name) AS max_salary
FROM   employee

Wie bereits erwähnt, klappen Fensterfunktionen keine Datensätze zusammen. Im folgenden Ergebnis haben wir eine Zeile pro Mitarbeiter für insgesamt 5 Zeilen:

employee_namesalarydepartment_namemax_salary
John Doe93000Accounting93000
Jeremy Smith134000Sales134000
Donna Hayes120000Sales134000
Mark Ron78000Human Resources78000
Denis Serge72000Human Resources78000

Beachten Sie, dass wir die Spalten employee_name und Gehalt hinzugefügt haben, indem wir einfach ihre Namen zur Liste der Spalten in SELECT hinzugefügt haben. Wir konnten sie wegen der Einschränkung des Zusammenklappens nicht zur Abfrage mit GROUP BY hinzufügen.

In dem Artikel SQL Fensterfunktionen by Explanation finden Sie eine detaillierte Erklärung der Unterschiede zwischen Aggregat- und Fensterfunktionen.

4. Was ist der Unterschied zwischen Fensterfunktionen und der GROUP BY-Klausel?

Aggregatfunktionen werden häufig mit der GROUP BY Klausel verwendet, die die Gruppen von Zeilen definiert, auf die die Aggregatfunktion angewendet wird. Die GROUP BY Klausel gruppiert einzelne Zeilen in Gruppen von Zeilen und ermöglicht die Ausführung von Aggregatfunktionen wie SUM(), AVG() oder MAX() auf diese Gruppen. Keine Spalte aus den einzelnen Zeilen kann Teil des Ergebnisses sein, wie in der folgenden SQL-Abfrage zu sehen ist:

SELECT   
   department_name, 
   AVG(salary)      -- AVG is an aggregate function
FROM  employee
GROUP BY department_name

In der obigen Abfrage wird nur eine Spalte in die Liste SELECT aufgenommen: department_name. Dies ist möglich, weil die Spalte department_name in der GROUP BY-Klausel enthalten ist. Wir können jedoch keine weiteren Spalten in die SELECT hinzufügen; nur Spalten, die in der GROUP BY angegeben sind, sind erlaubt.

Die folgende SQL-Abfrage ist äquivalent zu der vorherigen, aber sie verwendet Fensterfunktionen anstelle von GROUP BY:

SELECT
  department_name,
  AVG(salary) OVER(PARTITION BY department_name) -- AVG is a window function
FROM employee

Die vorherige Abfrage hat keine GROUP BY -Klausel, weil die Funktion AVG() als Fensterfunktion verwendet wird. Wir können erkennen, dass AVG() eine Fensterfunktion ist, weil die Klausel OVER vorhanden ist.

Ich empfehle den Artikel SQL Fensterfunktionen vs. GROUP BY für einen vollständigen Vergleich zwischen Fensterfunktionen und der GROUP BY Klausel.

5. Zeigen Sie ein Beispiel für SQL Fensterfunktionen.

Dies ist eine gute Gelegenheit, eine Abfrage zu erwähnen, die die Bedeutung von Fensterfunktionen zeigt und gleichzeitig mit den Abfragen, die wir in den vorherigen Fragen gezeigt haben, verbunden ist. Die Abfrage, die ich vorschlage, würde diese Aufgabe lösen: "Ermitteln Sie die Namen der Mitarbeiter, die Gehälter, die Namen der Abteilungen und das durchschnittliche Gehalt dieser Abteilung."

Diese Abfrage zeigt auf einfache Weise, wie wir Daten auf Zeilenebene und aggregierte Daten kombinieren können. (Die Fensterfunktion gibt die aggregierten Daten zurück.)

SELECT employee_name,
       salary,
       department_name,
       AVG(salary) OVER (PARTITION BY department) avg_salary 
FROM employee

Oben sehen wir die Spalten auf Zeilenebene employee_name, salary und department mit dem Durchschnittsgehalt jeder Abteilung, das von der Fensterfunktion AVG() berechnet wird. In der Unterklausel PARTITION BY wird festgelegt, dass die Datensatzfenster auf der Grundlage des Werts der Spalte department_name erstellt werden. Alle Datensätze mit demselben Wert in department_name befinden sich im selben Fenster. Das Ergebnis würde etwa so aussehen:

employee_namesalarydepartment_nameavg_salary
John Doe93000Accounting93000
Jeremy Smith134000Sales127000
Donna Hayes120000Sales127000
Mark Ron78000Human Resources75000
Denis Serge72000Human Resources75000

Weitere Beispiele für Fensterfunktionen finden Sie in dem Artikel Beispiel fuer SQL Fensterfunktionen mit erklärungen.

6. Nennen Sie einige gängige Fensterfunktionen.

Fensterfunktionen können in vier Kategorien eingeteilt werden: Aggregatfunktionen, Rankingfunktionen, analytische Funktionen und Verteilungsfunktionen.

Die Aggregatfunktionen sind die regulären Aggregatfunktionen, die Sie mit GROUP BY verwenden: MAX(), MIN(), AVG(), SUM(), und COUNT(). Diese Funktionen können, wie wir bereits gezeigt haben, als Fensterfunktionen verwendet werden.

Die Ranking-Funktionen sind ROW_NUMBER(), RANK() und DENSE_RANK(). Sie werden verwendet, um verschiedene Positionen in einer Rangliste zu erhalten. Eine ausführliche Erläuterung der Ranking-Funktionen finden Sie im folgenden Artikel.

Zu den analytischen Funktionen gehören LEAD(), LAG(), FIRST_VALUE(), LAST_VALUE() und NTH_VALUE(). Diese Funktionen ermöglichen es, Daten aus anderen Zeilen als der aktuellen Zeile zu erhalten (z. B. die vorherige Zeile, die nächste Zeile, die letzte Zeile innerhalb eines Fensterrahmens usw.). Die Funktion NTILE() unterteilt die Zeilen innerhalb einer Partition in n Gruppen und gibt die Gruppennummer zurück.

Die Verteilungsfunktionen PERCENT_RANK() und CUME_DIST() schließlich ermöglichen es uns, Daten über das Perzentil bzw. die kumulative Verteilung für jede Zeile im Fenster zu erhalten.

Ich bevorzuge analytische Funktionen, weil sie es uns ermöglichen, die Unterschiede zwischen verschiedenen Datensätzen innerhalb des Fensters zu vergleichen oder zu berechnen (neben anderen Dingen). Wenn ich z. B. eine Zeitreihe mit Aktienwerten habe, kann ich berechnen, um wie viel die Aktie zu jedem Zeitpunkt gestiegen ist.

Hier ist ein weiteres Beispiel für analytische Funktionen. Die analytischen Fensterfunktionen LEAD() und LAG() geben eine Spalte aus einer nachfolgenden/vorherigen Zeile zurück. Wenn wir also eine Tabelle mit Kryptowährungen haben, mit einem Zeitstempel und einem Kurswert ...

SymbolTimestampValue
BTC2021-05-25 10:3061400
BTC2021-05-25 10:4060300
BTC2021-05-25 10:5059800
ETH2021-05-25 10:302700
ETH2021-05-25 10:402750
ETH2021-05-25 10:502820

Tabelle Aktien

... können wir den folgenden Bericht erhalten. Um die prozentuale Abweichung zu berechnen, benötigen wir Daten aus zwei verschiedenen Zeilen: Den Wert in der aktuellen Zeile und den Wert in der vorherigen Zeile. Die Funktion LEAD() gibt den Wert der vorherigen Zeile zurück. Dies ist das Ergebnis:

SymbolTimestampValue% Variation
BTC2021-05-25 10:3061400--
BTC2021-05-25 10:4060300-1.8%
BTC2021-05-25 10:5059800-0.8%
ETH2021-05-25 10:302700--
ETH2021-05-25 10:4027501.8%
ETH2021-05-25 10:5028202.5%

Die Spalte % Variation wurde mit dieser Art von Ausdruck berechnet:

(Current_value - Previous_value ) / Previous_value

Beachten Sie, dass der Kryptowährungswert des vorherigen Zeitstempels mit erhalten werden kann:

LEAD(value) OVER (PARTITION BY crypto_symbol ORDER BY timestamp) 

Hier ist die vollständige Abfrage:

SELECT Symbol, 
       Timestamp, 
       Value, 
       (Value - LEAD(Value) OVER (PARTITION BY Symbol ORDER BY Timestamp) /   
       LEAD(Value) OVER (PARTITION BY Symbol ORDER BY Timestamp) AS “% variation”
FROM   Cryptocurrencies

Wenn Sie sich eingehender mit LAG() und LEAD() beschäftigen möchten, empfehle ich Ihnen, den Artikel The LAG() Function and the LEAD() Function in SQL zu lesen. Dort wird ausführlich erklärt, wie Fensterfunktionen in geordneten Fenstern funktionieren.

Intermediate Window Function Fragen

7. Wie definieren Sie den Fensterrahmen?

Fensterfunktionen berechnen ein aggregiertes Ergebnis auf der Grundlage einer Reihe von Datensätzen, die als "Fenster" oder "Fensterrahmen" bezeichnet werden. Fensterrahmen werden durch die Klausel OVER() definiert.

Eine leere OVER() Klausel bedeutet, dass das Fenster der gesamte Datensatz ist:

SELECT employee_name,
       salary,
       department_name,
       AVG(salary) OVER () avg_salary 
FROM employee

Die obige Abfrage berechnet das Durchschnittsgehalt und zeigt es neben den anderen Mitarbeiterdetails für alle Mitarbeiter in der Tabelle an.

Es gibt mehrere Unterklauseln, die innerhalb der OVER() Klausel platziert werden können, um ein Fenster genau zu definieren.

Die Unterklausel PARTITION BY legt fest, dass alle Datensätze mit demselben Wert in einer bestimmten Spalte zum selben Fenster gehören. Mit anderen Worten: PARTITION BY gibt an, wie das Fenster definiert wird. So berechnet die folgende Abfrage das Durchschnittsgehalt für jede Abteilung; die Berechnungen werden auf der Grundlage von Gruppierungen der Werte in der Spalte department_name durchgeführt.

SELECT 
   employee_name,
   salary,
   department_name,
   AVG(salary) OVER (PARTITION BY department_name) avg_salary 
FROM employee

ORDER BY kann auch innerhalb von OVER() verwendet werden. Es wird verwendet, um Fensterzeilen in eine bestimmte Reihenfolge zu bringen. Geordnete Fenster sind sehr wichtig, da sie die Verwendung mehrerer analytischer Funktionen wie LAG(), LEAD() und FIRST_VALUE() ermöglichen.

SELECT 
   employee_name,
   salary,
   department_name,
   LAG(salary) OVER (ORDER BY salary) prev_salary 
FROM employee

Diese Abfrage zeigt das Gehalt des Mitarbeiters an, der in der Gehaltsreihenfolge unmittelbar vor dem aktuellen Mitarbeiter steht. Beachten Sie, dass Sie die Klauseln ORDER BY und PARTITION BY in einer Abfrage kombinieren können: Die Reihenfolge wird auf jede Partition einzeln angewendet.

Zwei ähnliche OVER() Unterklauseln sind RANGE und ROWS. Sie definieren Grenzen für den Fensterrahmen, indem sie obere und/oder untere Grenzen für das Fenster der Datensätze setzen. Dies bedeutet, dass Fensterfunktionen auf der Grundlage einer Teilmenge von Zeilen anstelle aller Zeilen im Fenster berechnet werden können. Der Unterschied zwischen ROW und RANGE wird in unserem Spickzettel zu SQL-Fensterfunktionen ausführlich erläutert. Mehr über ROWS und RANGE und die verschiedenen verfügbaren Begrenzungsoptionen erfahren Sie in den nächsten beiden Fragen.

8. Wie funktioniert ORDER BY mit OVER?

Einige Fensterfunktionen (wie LAG(), LEAD(), und FIRST_VALUE()) arbeiten mit einem geordneten Fenster von Datensätzen. Wenn wir eine dieser Funktionen verwenden, brauchen wir die ORDER BY Unterklausel, um die Ordnungskriterien zu definieren. Ein gutes Beispiel dafür ist die vorherige Abfrage, mit der wir die prozentuale Abweichung für Kryptowährungen berechnet haben:

SELECT Symbol, 
       Timestamp, 
       Value, 
       (Value - LEAD(Value) OVER (PARTITION BY Symbol ORDER BY Timestamp) /   
       LEAD(Value) OVER (PARTITION BY Symbol ORDER BY Timestamp) AS “% variation”
FROM   Cryptocurrencies

In der obigen Abfrage hat die Klausel OVER zwei Unterklauseln: PARTITION BY und ORDER BY. PARTITION BY definiert, welche Datensätze sich in jedem Fenster befinden, und ORDER BY definiert die Reihenfolge der Datensätze im Fenster. (In diesem Beispiel ordnen wir die Datensätze nach ihrem Zeitstempel.) Die Funktion LEAD() gibt dann den Wert des vorherigen Datensatzes zurück.

Wenn die Klausel OVER keine ORDER BY enthält und kein ROWS/RANGE vorhanden ist, wird der Fensterrahmen durch alle Zeilen gebildet, die der PARTITION BY-Klausel entsprechen. Wenn wir jedoch eine ORDER BY-Klausel ohne ROWS/RANGE verwenden, umfasst der Fensterrahmen die Zeilen zwischen der ersten Zeile (basierend auf der ORDER BY-Klausel) und der aktuellen Zeile. Mit anderen Worten: Die Zeilen, die nach der aktuellen Zeile kommen, werden nicht in den Fensterrahmen aufgenommen. (Weitere Einzelheiten zu diesen Grenzen werden in der nächsten Frage erläutert).

Die Fensterfunktionen, die eine ORDER BY Subklausel erfordern, sind:

  • RANK()
  • DENSE_RANK()
  • LEAD()
  • LAG()
  • FIRST_VALUE()
  • LAST_VALUE()
  • NTH_VALUE()
  • PERCENT_RANK()
  • CUME_LIST()

Wenn Sie mehr darüber erfahren möchten, wie ORDER BY funktioniert, lesen Sie den Artikel Wie man die differenz zwischen zwei zeilen in SQL berechnet.

Fragen zur erweiterten Fensterfunktion

9. Erklären Sie, was UNBOUNDED PRECEDING bewirkt.

Ein Fensterrahmen ist ein Satz von Zeilen, die in irgendeiner Weise mit der aktuellen Zeile in Beziehung stehen, die in jeder Partition separat ausgewertet wird. Wenn wir die ORDER BY Klausel verwenden, können wir optional obere und untere Grenzen für den Fensterrahmen definieren. Die Grenzen können wie folgt definiert werden:

  • UNBOUNDED PRECEDING
  • n PRECEDING
  • CURRENT ROW
  • n FOLLOWING
  • UNBOUNDED FOLLOWING

Diese Grenzen können mit den Unterklauseln RANGE oder ROWS in der Klausel OVER() definiert werden. UNBOUNDED PRECEDING gibt an, dass die untere Grenze des Fensters der erste Datensatz im Fenster ist; ebenso kann die obere Grenze mit UNBOUNDED FOLLOWING oder CURRENT ROW definiert werden. Diese Grenzen sollten nur bei geordneten Fenstern verwendet werden.

In der folgenden Abbildung sehen Sie, wie die verschiedenen Grenzen funktionieren:

SQL-Fensterfunktionen

Wenn wir zum Beispiel den Durchschnittswert einer Kryptowährung erhalten möchten, indem wir nur die Werte bis zum aktuellen Wert berücksichtigen, können wir die folgende OVER() Klausel verwenden:

AVG(value) OVER (PARTITION BY symbol_name 
                 ORDER BY timestamp 
                 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                 ) 

In dieser OVER() Klausel haben wir CURRENT ROW als obere Grenze des Fensters für die Berechnung des Durchschnitts definiert. Dies ist genau das, was wir brauchen, da wir die nach dem aktuellen Zeitstempel registrierten Werte nicht in die Durchschnittsberechnung einbeziehen wollen.

10. Beschreiben Sie die Reihenfolge der SQL-Operationen und Fensterfunktionen' Platz in dieser Reihenfolge.

Die Unterklauseln eines SQL SELECT werden in der folgenden Reihenfolge ausgeführt:

  1. FROM / JOINS
  2. WHERE
  3. GRUPPE BY
  4. Aggregat-Funktionen
  5. HAVING
  6. Fensterfunktionen
  7. SELECT
  8. DISTINCT
  9. VEREINIGUNG / ÜBERSCHNEIDUNG / AUSNAHME
  10. ORDER BY
  11. OFFSET
  12. LIMIT / FETCH / TOP

Da die Fensterfunktionen in Schritt 6 berechnet werden, können wir sie nicht in die WHERE -Klausel einfügen (die in Schritt 2 berechnet wird). Wir können diese Einschränkung jedoch umgehen, indem wir eine CTE (common table expression) verwenden, in der wir Window-Funktionen aufrufen und ihre Ergebnisse als Spalten in der CTE speichern können. Die CTE wird wie eine Tabelle behandelt und die Ergebnisse der Fensterfunktionen werden von WHERE als reguläre Spaltenwerte ausgewertet.

Es gibt einen interessanten Artikel darüber, warum Fensterfunktionen in WHERE-Klauseln nicht erlaubt sind, den Sie lesen sollten, wenn Sie nach Beispielen suchen.

Andererseits können wir Aggregations-/Gruppierungsergebnisse in Fensterfunktionen verwenden, da sie bereits berechnet sind, wenn die Fensterfunktionen verarbeitet werden.

Möchten Sie Ihre SQL Fensterfunktionen Kenntnisse verbessern?

Dieser Artikel behandelt mehrere mögliche Fragen zu SQL-Fensterfunktionen in Vorstellungsgesprächen. Abschließend möchte ich Ihnen raten, die Fragen in diesem Artikel mit den Fragen zu verknüpfen, die Sie in einem Vorstellungsgespräch stellen werden. Hier ist er:

Versuchen Sie, jede Frage in diesem Artikel mit einem Fensterfunktionsthema zu verbinden, z. B. "OVER clause", "name a function" oder "ORDER BY sub-clause". Wenn Sie dann im Vorstellungsgespräch nach Fensterfunktionen gefragt werden, identifizieren Sie das Thema der Frage und verwenden Sie die Informationen hier, um das Thema zu diskutieren.

Wenn Sie sich eingehender mit SQL-Fensterfunktionen beschäftigen möchten, empfehle ich Ihnen den Artikel Kurs des Monats - Fensterfunktionen, der unseren Kurs Fensterfunktionen beschreibt. Die Erweiterung Ihrer Kenntnisse ist eine Investition, die Ihnen helfen könnte, die Stelle zu bekommen!