23rd Jun 2022 15 Leseminuten Die 10 besten SQL-Fensterfunktionen Interviewfragen Ignacio L. Bisso Window Functions SQL-Interviewfragen Inhaltsverzeichnis Häufige Fragen im Vorstellungsgespräch zu SQL Fensterfunktionen 1. Was ist eine Fensterfunktion in SQL? Einstiegsfragen zur Fensterfunktion 2. Was ist die Syntax der OVER ()-Klausel? 3. Beschreiben Sie den Unterschied zwischen Fensterfunktionen und Aggregatfunktionen. 4. Was ist der Unterschied zwischen Fensterfunktionen und der GROUP BY-Klausel? 5. Zeigen Sie ein Beispiel für SQL Fensterfunktionen. 6. Nennen Sie einige gängige Fensterfunktionen. Intermediate Window Function Fragen 7. Wie definieren Sie den Fensterrahmen? 8. Wie funktioniert ORDER BY mit OVER? Fragen zur erweiterten Fensterfunktion 9. Erklären Sie, was UNBOUNDED PRECEDING bewirkt. 10. Beschreiben Sie die Reihenfolge der SQL-Operationen und Fensterfunktionen' Platz in dieser Reihenfolge. Möchten Sie Ihre SQL Fensterfunktionen Kenntnisse verbessern? 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: 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: FROM / JOINS WHERE GRUPPE BY Aggregat-Funktionen HAVING Fensterfunktionen SELECT DISTINCT VEREINIGUNG / ÜBERSCHNEIDUNG / AUSNAHME ORDER BY OFFSET 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! Tags: Window Functions SQL-Interviewfragen