Zurück zur Artikelliste Artikel
14 Leseminuten

BigQuery-Fensterfunktionen erklärt

Wenn Sie mit den Trends in der Datenanalyse Schritt halten, ist Ihr Unternehmen - und Ihr Lebenslauf - auf dem neuesten Stand. In diesem Artikel werden wir uns die BigQuery-Fensterfunktionen ansehen und wie Sie sie nutzen können, um tiefere Einblicke in Ihre Daten zu gewinnen.

BigQuery von Google wurde 2010 auf den Markt gebracht und erfreut sich zunehmender Beliebtheit bei Unternehmen, die große Mengen an Informationen schnell analysieren und ihre eigenen Daten mit öffentlich zugänglichen statistischen Daten vergleichen müssen.

Seitdem Google die Datenabfragesprache von BigQuery an den SQL-Standard angepasst und erweiterte Funktionen wie SQL-Fensterfunktionen hinzugefügt hat, ist die Popularität des Programms gestiegen. In vielen Unternehmen sind BigQuery-Kenntnisse inzwischen ein Muss, und das bedeutet, dass SQL-Kenntnisse gefragter sind denn je. Dieser Artikel erklärt, warum SQL-Kenntnisse für die Arbeit mit BigQuery unerlässlich sind

SQL ist nach wie vor die wichtigste Kompetenz für alle, die mit Daten arbeiten müssen. Wenn Sie noch kein SQL-Guru sind, könnten Sie sich für unseren SQL von A bis Z Lernpfad interessieren. Er umfasst 7 Kurse, die Sie vom absoluten Anfänger zum SQL-Experten machen. Der Kurs enthält Hunderte von Programmieraufgaben aus der Praxis und dauert etwa 84 Stunden. Da Sie über Ihren Browser auf die Beispieldatenbanken zugreifen können, müssen Sie keine Software installieren, um loszulegen.

Was ist BigQuery?

Google BigQuery ist ein Hochgeschwindigkeits-Datenlager in der Cloud. Es wurde speziell für die Speicherung von Analysedaten entwickelt und kann Petabytes an Daten in wenigen Minuten verarbeiten. Falls Sie sich mit Petabytes noch nicht auskennen: Ein Petabyte ist eine Billiarde Bytes (oder eine Million Gigabytes).

Sie zahlen für das, was Sie in BigQuery verwenden, so dass die Kosten für die Speicherung und Analyse großer Datenmengen in der Regel viel niedriger sind als die Investition in viele Festplatten. Und da alle Arten von nützlichen statistischen Daten von Regierungen und Weltorganisationen öffentlich in BigQuery gespeichert sind, können Sie darauf zugreifen, um Erkenntnisse darüber zu gewinnen, wie die Leistung Ihres Unternehmens verbessert werden könnte.

Was sind SQL Fensterfunktionen?

Fensterfunktionen sind auch als analytische Funktionen oder OVER-Funktionen bekannt. Sie wurden 2003 in den SQL-Standard aufgenommen, und die meisten großen Datenbankanbieter haben sie ab 2010 implementiert. Sie sind also eine relativ neue Ergänzung zu SQL.

Bevor Fensterfunktionen in SQL aufgenommen wurden, konnten Sie entweder einzelne Zeilen auflisten oder Aggregate wie Summen und Durchschnittswerte berechnen. Beides war in ein und derselben Abfrage nicht möglich, es sei denn, man schrieb komplexe - und wahrscheinlich langsame und ineffiziente - Unterabfragen.

Das bedeutet, dass Sie entweder eine Liste wie diese haben können ...

Student IDSubjectScore
1Math63
1Science50
2Math59

... oder Sie könnten Aggregate wie dieses anzeigen:

SubjectClass Average
Math52
Science61
English55
Overall Average56

Wenn Sie in diesem Beispiel wissen wollen, wie die Punktzahl eines einzelnen Schülers im Vergleich zum Klassendurchschnitt ausfällt, müssen Sie sich die beiden Berichte nebeneinander ansehen. Es wäre viel schöner, wenn Sie den Klassendurchschnitt in derselben Zeile wie die Punktzahl eines Schülers sehen könnten, so wie hier:

Student IDSubjectScoreClass Average
1Math6362
1Science5061
2Math5952

Wie ich bereits erwähnt habe, könnten Sie dies mit Unterabfragen erreichen. Aber Unterabfragen sind notorisch langsam in der Ausführung und können Ihre Abfrage sehr kompliziert machen.

Mit den Fensterfunktionen können Sie genau das einfach und effizient tun: Aggregate neben Details in derselben Zeile einfügen.

Warum werden sie Fensterfunktionen genannt?

Sie werden Fensterfunktionen genannt, weil Sie, während Sie eine einzelne Zeile betrachten, auch "durch das Fenster" schauen und Informationen aus dem gesamten Datensatz oder aus Zeilen, die mit der aktuellen Zeile in Beziehung stehen, extrahieren können.

Betrachten wir als Beispiel eine Tabelle mit den Noten der Schüler:

Student IDTeacher IDSubjectGrade
11Math63
21Math80
32Math60
42Math45
51Math52
61Math70
72Math65
12Science70
22Science62
32Science90
42Science30
52Science53
15English59
35English70
55English45
65English62
112History55
312History67
412History58

Wie im vorigen Beispiel möchten wir den Klassendurchschnitt neben jedem Schüler anzeigen, so dass eine einzelne Zeile wie folgt aussieht:

Student IDSubjectGradeClass Average
4Math4562

Dazu müssen wir beim Extrahieren dieser Zeile den Durchschnitt aller anderen Schüler berücksichtigen und das Ergebnis neben den anderen Daten anzeigen.

BigQuery Fensterfunktionen Explained

In SQL verwenden Fensterfunktionen ein gleitendes Fenster von Zeilen, um zusätzliche Informationen entweder aus dem gesamten Datensatz oder aus einer Teilmenge in Bezug auf die aktuelle Zeile zu extrahieren.

Im obigen Diagramm ist die aktuelle Zeile ein mathematisches Ergebnis, und das Fenster enthält alle mathematischen Noten.

Wenn wir diese Zeile extrahieren ...

Student IDSubjectGradeClass Average
1Science7062

... müssen wir das Fenster "verschieben", damit wir alle naturwissenschaftlichen Ergebnisse sehen, um den Durchschnitt für Naturwissenschaften zu berechnen.

Fensterfunktionen haben viele der gleichen Fähigkeiten wie die GROUP BY-Klausel, aber der Unterschied besteht darin, dass sie uns erlauben, Aggregate und Details nebeneinander anzuzeigen.

Syntax von BigQuery Fensterfunktionen

Die OVER()-Klausel

Die OVER() Klausel zeigt an, dass Sie eine Fensterfunktion verwenden. Sie schreiben Ihre Abfrage wie gewohnt und fügen die gewünschten Aggregate neben den anderen Spaltennamen ein. Jedes Aggregat wird mit der Klausel OVER() gekennzeichnet. Wenn Sie diese Klausel allein verwenden, ist das "Fenster" der gesamte Datensatz. Auf gleitende Fenster gehe ich später in diesem Artikel noch näher ein.

Wenn Sie zum Beispiel alle Matheergebnisse extrahieren und den Klassendurchschnitt sowie die höchste und niedrigste Note für jeden Schüler anzeigen möchten, würde Ihre Abfrage wie folgt aussehen:

SELECT 
  student_id,
  grade,
  AVG(grade) OVER() AS average,
  MIN(grade) OVER() AS lowest,
  MAX(grade) OVER() AS highest
FROM exam_results
WHERE subject = 'Math';

Ihre Ergebnisse würden dann wie folgt aussehen:

student_idgradeaveragelowesthighest
163624580
280624580
360624580
445624580
552624580
670624580
765624580

Die PARTITION BY-Klausel

Diese Klausel verwendet ein gleitendes Fenster. Anstelle eines Fensters, das den gesamten Datensatz enthält, wird nur eine Partition (oder ein Teil) des Satzes einbezogen.

Im vorherigen Beispiel habe ich nur die mathematischen Ergebnisse einbezogen, indem ich alle anderen mit der Klausel WHERE ausgeschlossen habe. Wenn Sie einen Bericht wünschen, der die Ergebnisse für alle Fächer anzeigt, aber den Durchschnitt nur aus den Zeilen berechnet, in denen das Fach mit der aktuellen Zeile übereinstimmt, würden Sie die Klausel PARTITION BY verwenden:

SELECT 
  student_id,
  subject,
  grade,
  AVG(grade) OVER(PARTITION BY subject) AS average
FROM exam_results;

Schauen Sie sich diese farbcodierte Kopie der Tabelle mit den Noten der Schüler an, um zu sehen, wie die Unterteilungen funktionieren werden:

Student IDTeacher IDSubjectGrade
11Math63
21Math80
32Math60
42Math45
51Math52
61Math70
72Math65
12Science70
22Science62
32Science90
42Science30
52Science53
15English59
35English70
55English45
65English62
112History55
312History67
412History58

Bei der Verarbeitung jeder Zeile ändern sich die im Fenster enthaltenen Zeilen auf der Grundlage des Wertes in der Spalte subject. Das bedeutet, dass der Durchschnitt nur für die Partition des Datensatzes berechnet wird, in der das Thema mit der aktuellen Zeile übereinstimmt. Sie können sich das wie folgt vorstellen:

BigQuery Fensterfunktionen Explained

Die Ergebnisse würden wie folgt aussehen:

Student IDSubjectGradeClass Average
1Math6362
2Math8062
3Math6062
4Math4562
5Math5262
6Math7062
7Math6562
1Science7061
2Science6261
3Science9061
4Science3061
5Science5361
1English5959
3English7059
5English4559
6English6259
1History5560
3History6760
4History5860

Die ORDER BY-Klausel

Die ORDER BY -Klausel innerhalb der Funktion OVER() verwendet eine andere Art von gleitendem Fenster. Wenn Sie OVER(ORDER BY column_name) verwenden, schließt das Fenster nur die Zeilen ein, in denen der Wert der angegebenen Spalte kleiner oder gleich dem Wert dieser Spalte in der aktuellen Zeile ist.

Die Klausel ORDER BY ist nützlich für die Berechnung von laufenden Summen und gleitenden Durchschnitten. Als Beispiel verwende ich eine Tabelle namens monthly_transactions die Bankkontotransaktionen enthält:

account_idtran_datetransactionvalue
12023-09-01Opening Balance500.00
12023-09-03Deposit137.45
12023-09-12Withdrawal-200.00
12023-09-18Withdrawal-250.00
22023-09-01Opening Balance1200.00
22023-09-14Deposit900.00
22023-09-20Purchase-318.90

Die folgende Abfrage listet die Transaktionen für die Konto-ID 1 auf und zeigt einen laufenden Saldo an.

SELECT 
  account_id,
  tran_date,
  transaction,
  value,
  SUM(value) OVER(ORDER BY tran_date) AS balance
FROM monthly_transactions
WHERE account_id = 1;

Die Einbeziehung der Klausel ORDER BY in die Klausel OVER steuert ein gleitendes Fenster.

Wenn Sie möchten, können Sie auch die übliche ORDER BY Klausel am Ende der Abfrage verwenden, um die endgültige Reihenfolge der Zeilen im Bericht zu steuern. Sie müssen nicht unbedingt in der ursprünglichen Reihenfolge angezeigt werden.

Standardmäßig bewirkt die Verwendung von ORDER BY innerhalb der OVER -Klausel, dass das Fenster so verschoben wird, dass nur Zeilen angezeigt werden, deren Datum kleiner oder gleich dem Datum der aktuellen Zeile ist. Es gibt noch weitere Schlüsselwörter, die diese Vorgabe ändern können, aber das würde den Rahmen dieses Artikels sprengen.

Sie können sich das folgendermaßen vorstellen:

BigQuery Fensterfunktionen Explained

Die Ergebnisse würden wie folgt aussehen:

account_idtran_datetransactionvaluebalance
12023-09-01Opening Balance500.00500.00
12023-09-03Deposit137.45637.45
12023-09-12Withdrawal-200.00437.45
12023-09-18Withdrawal-250.00187.45
22023-09-01Opening Balance1200.001200.00
22023-09-14Deposit900.002100.00
22023-09-20Purchase-318.901781.10

Verwendung von ORDER BY mit der PARTITION BY-Klausel

Wenn Sie alle Konten mit ihren laufenden Salden anzeigen möchten, können Sie PARTITION BY und ORDER BY zusammen verwenden:

SELECT 
  account_id,
  tran_date,
  transaction,
  value,
  SUM(value) OVER(PARTITION BY account_id ORDER BY tran_date) AS balance
FROM monthly_transactions
ORDER BY account_id, tran_date

Die Klausel PARTITION BY bewirkt, dass das gleitende Fenster nur Zeilen enthält, in denen account_id mit der aktuellen Zeile übereinstimmt. Die Klausel ORDER BY bewirkt, dass nur Zeilen innerhalb dieser Partition angezeigt werden, deren Datum kleiner oder gleich dem Datum der aktuellen Zeile ist.

Das Ergebnis wäre wie folgt:

account_idtran_datetransactionvaluebalance
12023-09-01Opening Balance500.00500.00
12023-09-03Deposit137.45637.45
12023-09-12Withdrawal-200.00437.45
12023-09-18Withdrawal-250.00187.45
22023-09-01Opening Balance1200.001200.00
22023-09-14Deposit900.002100.00
22023-09-20Purchase-318.901781.10

Jedes Konto hat einen eigenen laufenden Saldo.

SQL Fensterfunktionen verfügbar in BigQuery

Sie haben gesehen, wie gängige SQL-Aggregatfunktionen wie SUM(), AVG(), MIN() und MAX() in Verbindung mit der OVER-Klausel verwendet werden können, um Aggregate aus einem Datenfenster zu extrahieren.

Google BigQuery verfügt, wie viele andere SQL-Dialekte auch, über zusätzliche Funktionen, die tiefere Einblicke in die Daten geben können. Hier sind einige Beispiele.

RANK()

Diese Funktion ordnet den Datensatz vom höchsten zum niedrigsten Wert in einer bestimmten Spalte. Sie kann Fragen beantworten wie:

  • Welchen Platz hat jeder Schüler in der Klasse aufgrund der Prüfungsergebnisse eingenommen?
  • Welche Produkte waren am profitabelsten?
  • Welche Kunden gaben das meiste Geld aus?
  • Welches Lager erhielt die meisten Beschwerden?

Anhand der Beispieltabelle, die wir uns vorhin angesehen haben, können wir mit dieser Abfrage die Studenten nach ihren Prüfungsergebnissen einordnen:

SELECT 
  student_id,
  subject,
  grade,
  RANK() OVER(PARTITION BY subject ORDER BY grade desc) AS place
FROM exam_results
ORDER BY subject, grade DESC;

Das Ergebnis würde lauten:

student_idsubjectgradeplace
3English701
6English622
1English593
5English454
3History671
4History582
1History553
2Math801
6Math702
7Math653
1Math634
3Math605
5Math526
4Math457
3Science901
1Science702
2Science623
5Science534
4Science305

Bei der Berechnung dieser Ergebnisse veranlasst die PARTITION BY subject-Klausel SQL, nur die Ergebnisse für das gleiche Fach wie die aktuelle Zeile zu betrachten. Die ORDER BY grade DESC Klausel sortiert sie in absteigender Reihenfolge der Note. Die Funktion RANK() ordnet die Schüler dann in dieser Reihenfolge an.

Da Schüler 3 die beste Note in Englisch hat, ist sein Rang 1; Schüler 6, der nächstbeste, ist in diesem Fach auf Rang 2. Schüler 2 hat die beste Note in Mathe und wird auf Platz 1 eingestuft.

DENSE_RANK()

DENSE_RANK() wird für denselben Zweck verwendet wie RANK. Der Unterschied zwischen den beiden lässt sich am besten anhand dieser Abfrageergebnisse erklären, die Ergebnisse in einem Schießwettbewerb darstellen.

Mit RANK würde die Abfrage lauten:

SELECT 
  competitor_no,
  score,
  RANK() OVER(ORDER BY score desc) AS rank
FROM match_results
ORDER BY score DESC;

Die Ergebnisse sind:

Competitor NoScoreRank
4851
5832
10832
9814
2765
6765
7727
3708
8689
16210

Die Mitbewerber 5 und 10 liegen gleichauf auf dem zweiten Platz und erhalten beide die Note 2. Der Mitbewerber 9 ist der nächstplatzierte und erhält die Note 4. Der dritte Platz wird nicht berücksichtigt.

Mit DENSE_RANK lautet die Abfrage:

SELECT 
  competitor_no,
  score,
  DENSE RANK() OVER(ORDER BY score desc) AS rank
FROM match_results
ORDER BY score DESC;

Die Ergebnisse sind:

Competitor NoScoreRank
4851
5832
10832
9813
2764
6764
7725
3706
8687
1628

Die Mitbewerber 5 und 10 haben immer noch beide den Rang 2, aber der dritte Platz wird nicht ausgelassen: Mitbewerber 9 hat jetzt den Rang 3.

Beide Funktionen haben die gleiche Syntax. Wenn wir die Abfrage nach den Noten der vorherigen Schüler mit der Funktion DENSE_RANK() umcodieren wollten, würde sie so aussehen:

SELECT 
  student_id,
  subject,
  grade,
  DENSE_RANK() OVER(PARTITION BY subject ORDER BY grade desc) AS class_place
FROM exam_results
ORDER BY subject, grade DESC

Da es aber keine Gleichheitswerte gibt, wäre das Ergebnis dasselbe.

ROW_NUMBER()

Die Funktion ROW_NUMBER() funktioniert ähnlich wie die beiden vorherigen Funktionen, aber die Zeilen werden einfach der Reihe nach nummeriert. Wenn Zeilen denselben Wert haben, werden sie fortlaufend nummeriert, je nachdem, welche Zeile zuerst gefunden wurde. Hier sind die Ergebnisse der Abfrage des Schießwettbewerbs unter Verwendung von ROW_NUMBER() anstelle von RANK() oder DENSE_RANK():

Competitor NoScoreRank
4851
5832
10833
9814
2765
6766
7727
3708
8689
16210

LAG()

Mit dieser Funktion können Sie Daten aus der vorherigen Zeile der Ergebnismenge mit den Daten der aktuellen Zeile vergleichen. Sie ist ideal für Jahresvergleiche und ermöglicht es Ihnen, Trends zu entdecken und Probleme mit der Unternehmensleistung zu erkennen.

LAG() und die zugehörige Funktion LEAD() können nur in Verbindung mit der Klausel OVER(ORDER BY) verwendet werden.

Nehmen Sie als Beispiel die folgende Tabelle, die Umsatzdaten für ein kleines Unternehmen enthält:

yearsales_valuesales_quantityprofit
2019540009008000
202075000120011000
2021300004501000
202260000100007000

Die Beispielabfrage zum Vergleich der Jahreszahlen lautet:

SELECT 
  year,
  sales_value,
  sales_quantity,
  profit,
  LAG(sales_value) OVER(ORDER BY year) as ly_value,
  LAG(sales_quantity) OVER(ORDER BY year) as ly_qty,
  LAG(profit) OVER(ORDER BY year) as ly_profit,
  profit - LAG(profit) OVER(ORDER BY year) as inc_dec
FROM annual_sales
ORDER BY year;

Die Ergebnisse dieser Abfrage sind:

yearsales_valuesales_quantityprofitly_valuely_qtyly_profitinc_dec
2019540009008000NULLNULLNULLNULL
2020750001200110005400090080003000
202130000450100075000120011000-10000
2022600001000070003000045010006000

Schauen wir uns diese Zeile der Abfrage an und sehen wir, was sie tatsächlich bewirkt hat:

LAG(sales_value) OVER(ORDER BY year) as ly_value

In dieser Zeile des Ergebnisses ...

yearsales_valuesales_quantityprofitly_valuely_qtyly_profitinc_dec
2020750001200110005400090080003000

... ist unsere aktuelle Zeile für das Jahr 2020. Die Funktion LAG() in Verbindung mit ORDER BY year veranlasst SQL, die Zeile für das vorherige Jahr (2019) zu betrachten und den Umsatzwert daraus unter der Überschrift ly_value zu extrahieren.

Sie werden feststellen, dass in der ersten Zeile die von der Funktion LAG() berechneten Spalten einen Nullwert enthalten, da es keinen vorherigen Datensatz gibt.

LEAD()

Die Funktion LEAD() ist die Umkehrung der Funktion LAG(): Sie bezieht die Daten aus der Zeile nach der aktuellen Zeile und nicht aus der Zeile davor.

Um den Gewinn zwischen dem aktuellen Jahr, dem Vorjahr und dem Folgejahr unter Verwendung derselben Beispieltabelle zu vergleichen, würde die Abfrage lauten:

SELECT 
  year,
  profit,
  LAG(profit) OVER(ORDER BY year) as ly_profit,
  profit - LAG(profit) OVER(ORDER BY year) as ly_inc_dec,
  LEAD(profit) OVER(ORDER BY year) as ny_profit,
  LEAD(profit) OVER(ORDER BY year) - profit as ny_inc_dec
FROM annual_sales
ORDER BY year;

Die Ergebnisse dieser Abfrage wären:

yearprofitly_profitly_inc_decny_profitny_inc_dec
20198000NULLNULL110003000
202011000800030001000-10000
2021100011000-1000070006000
2022700010006000NULLNULL

Die Spalten ny_profit und ny_inc_dec verwenden die Funktion LEAD(), die SQL veranlasst, die nächste Zeile in der Reihenfolge zu betrachten, um diese Felder zu extrahieren. Wenn die aktuelle Zeile für 2019 ist, werden diese beiden Felder aus der Zeile für 2020 genommen.

Dies sollte Ihnen einen Eindruck von einigen der nützlichen SQL-Fensterfunktionen in BigQuery vermittelt haben. Eine vollständige Liste der Funktionen finden Sie in der BigQuery-SQL-Dokumentation.

Weitere Beispiele für Fensterfunktionen finden Sie in dem Artikel SQL Window Function Examples. Eine Kurzanleitung für die Syntax der SQL-Fensterfunktionen finden Sie auch in unserem Fensterfunktionen Cheat Sheet.

Praktische Verwendungen von BigQuery Fensterfunktionen

In der realen Welt gibt es viele Möglichkeiten, wie BigQuery-Fensterfunktionen Ihnen Einblicke geben können, um die Leistung Ihres Unternehmens zu verbessern. Sie sind sehr leistungsfähig und ermöglichen es Ihnen, sehr schnell komplexe Berichte zu erstellen.

Hier sind einige Ideen, wie die BigQuery-Fensterfunktionen verwendet werden können:

Nächste Schritte mit BigQuery Fensterfunktionen

Nachdem Sie nun gesehen haben, was SQL-Fensterfunktionen in BigQuery und anderen Datenbankmanagementsystemen leisten können, ist es an der Zeit, Ihre Kenntnisse in diesem wichtigen Bereich zu erweitern.

Ein guter Startpunkt ist der SQL-Kurs LearnSQL.de Fensterfunktionen . Dort lernen Sie Schritt für Schritt, wie Sie die in diesem Artikel vorgestellten Techniken anwenden können, und erhalten eine ausführliche Erklärung zu jedem Thema. Mit über 200 interaktiven Übungen erhalten Sie außerdem reichlich Übung, um sicherzustellen, dass Sie wissen, wie Sie komplexe Informationen in realen Situationen extrahieren können. Wenn Sie nicht weiterkommen, steht Ihnen Hilfe zur Verfügung, und Sie können über Ihren Browser auf Beispieldatenbanken zugreifen. Der Kurs dauert etwa 20 Stunden.

Wenn Sie wirklich ein Experte werden wollen, können Sie das Lösen komplexer Probleme noch weiter üben, indem Sie sich durch unser Fensterfunktionen Practice Set arbeiten. Sie werden 100 Beispiele für komplexe Berichte mit drei verschiedenen Datenbanken bearbeiten.

Lesen Sie auch diesen Artikel über das Üben von Fensterfunktionen, und erfahren Sie hier mehr über die BigQuery-Syntax.

Wenn Sie auf der Suche nach einer hochrangigen Stelle im Bereich Datenanalyse oder Data Science sind, werden Sie im Vorstellungsgespräch höchstwahrscheinlich aufgefordert, Ihre Kenntnisse der SQL-Fensterfunktionen unter Beweis zu stellen. Um eine Vorstellung davon zu bekommen, welche Art von Fragen Ihnen gestellt werden könnten (und wie Sie sie beantworten können), finden Sie hier einen Artikel, der die wichtigsten Fragen zu SQL-Fensterfunktionen im Vorstellungsgespräch behandelt.

Machen Sie noch heute den ersten Schritt, um Ihre Datenanalysefähigkeiten auf die nächste Stufe zu heben!