Analysefunktionskonzepte in Standard SQL
Eine Analysefunktion berechnet Werte über eine Gruppe von Zeilen und gibt für jede Zeile ein einzelnes Ergebnis zurück. Dies unterscheidet sich von einer Aggregatfunktion, die ein einzelnes Ergebnis für eine Gruppe von Zeilen zurückgibt.
Eine Analysefunktion enthält eine OVER
-Klausel, die ein Fenster mit Zeilen um die auszuwertende Zeile definiert. Für jede Zeile wird das analytische Funktionsergebnis unter Verwendung des ausgewählten Zeilenfensters als Eingabe berechnet, wobei möglicherweise eine Aggregation durchgeführt wird.
Mit Analysefunktionen können Sie gleitende Durchschnitte berechnen, Elemente ordnen, kumulative Summen berechnen und andere Analysen durchführen.
Die folgenden Funktionen können als Analysefunktionen verwendet werden:Navigationsfunktionen, Nummerierungsfunktionen und Aggregatanalysefunktionen
Syntax der Analysefunktion
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Notationsregeln
- Eckige Klammern „“ kennzeichnen optionale Klauseln.
- Klammern „( )“ gibt wörtliche Klammern an.
- Der vertikale Balken „|“ zeigt ein logisches ODER an.
- Geschweifte Klammern „{ }“ schließen eine Reihe von Optionen ein.
- Ein Komma gefolgt von einem Auslassungspunkt in eckigen Klammern „“ zeigt an, dassdas vorhergehende Element kann in einer durch Kommas getrennten Liste wiederholt werden.
Beschreibung
Eine Analysefunktion berechnet Ergebnisse über eine Gruppe von Zeilen. Sie können die folgende Syntax verwenden, um eine Analysefunktion zu erstellen:
-
analytic_function_name
: Die Funktion, die eine Analyseoperation ausführt.Hier könnte beispielsweise die NummerierungsfunktionRANK()
verwendet werden. -
argument_list
: Argumente, die für die Analysefunktion spezifisch sind.Einige Funktionen haben sie, andere nicht. -
OVER
: Schlüsselwort, das in der Syntax der Analysefunktion vor derOVER
-Klausel benötigt wird. -
over_clause
: Verweist auf ein Fenster, das eine Gruppe von Zeilen in einer Tabelle definiert, für die eine Analysefunktion verwendet werden soll. -
window_specification
: Definiert die Spezifikationen für das Fenster. -
window_frame_clause
: Definiert den Fensterrahmen für das Fenster. -
rows_range
: Definiert die physikalischen Zeilen oder den logischen Bereich für einen Fensterrahmen.
Anmerkungen
Eine Analysefunktion kann als skalarer Ausdrucksoperand an zwei Stellen in der Abfrage erscheinen:
- Die
SELECT
Liste. Wenn die Analysefunktion in derSELECT
-Liste angezeigt wird, können ihre Argumentliste und dieOVER
-Klausel nicht auf Aliase verweisen, die in derselben SELECT-Liste eingeführt wurden. - Die
ORDER BY
Klausel. Wenn die Analysefunktion in derORDER BY
-Klausel der Abfrage vorkommt, kann ihre Argumentliste aufSELECT
-Listenaliase verweisen.
Eine Analysefunktion kann nicht auf eine andere Analysefunktion in ihrer Argumentliste oder ihrer OVER
Klausel verweisen, auch nicht indirekt über einen Alias.
Eine analytische Funktion wird nach der Aggregation ausgewertet. Beispielsweise werden zuerst dieGROUP BY
-Klausel und nicht analytische Aggregatfunktionen ausgewertet.Da Aggregatfunktionen vor analytischen Funktionen ausgewertet werden, können Aggregatfunktionen als Eingabeoperanden für analytische Funktionen verwendet werden.
Gibt
Ein einzelnes Ergebnis für jede Zeile in der Eingabe zurück.
Definieren der OVER-Klausel
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Beschreibung
Die OVER
-Klausel verweist auf ein Fenster, das eine Gruppe von Zeilen in einer Tabelle definiert, für die eine Analysefunktion verwendet werden soll. Sie können einenamed_window
angeben, die in Ihrer Abfrage definiert ist, oder Sie können die Spezifikationen für ein neues Fenster definieren.
Hinweise
Wenn weder ein benanntes Fenster noch eine Fensterspezifikation angegeben ist, werden alle Eingabezeilen für jede Zeile in das Fenster aufgenommen.
Beispiele mit der OVER
Klausel
Diese Abfragen verwenden Fensterspezifikationen:
- Berechnen Sie eine Gesamtsumme
- Berechnen Sie eine Zwischensumme
- Berechnen Sie eine kumulative Summe
- Berechnen Sie einen gleitenden Durchschnitt
- Berechnen Sie die Anzahl der Elemente innerhalb eines Bereichs
- Holen Sie sich das beliebteste Element in jeder Kategorie
- Ermittelt den letzten Wert in einem Bereich
- Compute rank
Diese Abfragen verwenden ein benanntes Fenster:
- Den letzten Wert in einem Bereich abrufen
- Benanntes Fenster in einer window frame-Klausel verwenden
Definieren der Fensterspezifikation
window_specification: ] ]
Beschreibung
Definiert die Spezifikationen für das Fenster.
-
named_window
: Der Name eines vorhandenen Fensters, das mit einerWINDOW
-Klausel definiert wurde.
-
PARTITION BY
: Zerlegt die Eingabezeilen in separate Partitionen, über die die Analysefunktion unabhängig ausgewertet wird.- In der
PARTITION BY
-Klausel sind mehrere Partitionsausdrücke zulässig. - Ein Ausdruck darf keine Gleitkommatypen, nicht gruppierbaren Typen, Konstanten oder Analysefunktionen enthalten.
- Wenn diese optionale Klausel nicht verwendet wird, bilden alle Zeilen in der Eingabetabelleeine einzelne Partition.
- In der
-
ORDER BY
: Definiert, wie Zeilen innerhalb einer Partition angeordnet werden.Diese Klausel ist in den meisten Situationen optional, aber in einigen Fällen für Navigationsfunktionen erforderlich. -
window_frame_clause
: Definiert für aggregate analyticfunctions den Fensterrahmen innerhalb der aktuellen Partition.Der Fensterrahmen bestimmt, was in das Fenster aufgenommen werden soll.Wenn diese Klausel verwendet wird, istORDER BY
erforderlich, außer für vollständig nicht begrenzte Fenster.
Anmerkungen
Wenn weder die ORDER BY
-Klausel noch die window frame-Klausel vorhanden sind, enthält der window frame alle Zeilen in dieser Partition.
Wenn bei aggregierten Analysefunktionen die ORDER BY
-Klausel vorhanden ist, die window frame-Klausel jedoch nicht, wird standardmäßig die folgende Window frame-Klausel verwendet:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Die folgenden Abfragen sind beispielsweise äquivalent:
SELECT book, LAST_VALUE(item) OVER (ORDER BY year)FROM Library
SELECT book, LAST_VALUE(item) OVER ( ORDER BY year RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)FROM Library
Regeln für die Verwendung eines benannten Fensters in der Fensterspezifikation
Wenn Sie ein benanntes Fenster in Ihren Fensterspezifikationen verwenden, gelten folgende Regeln:
- Die Spezifikationen im benannten Fenster können um neue Spezifikationen erweitert werden, die Sie in der window specification-Klausel definieren.
- Sie können keine redundanten Definitionen haben. Wenn Sie eine
ORDER BY
Klausel habenim benannten Fenster und in der window specification Klausel wird anerror ausgelöst. -
Die Reihenfolge der Klauseln ist wichtig.
PARTITION BY
muss zuerst kommen, gefolgt vonORDER BY
undwindow_frame_clause
. Wenn Sie ein benanntes Fenster hinzufügen, werden dessen Fensterspezifikationen zuerst verarbeitet.--this works:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW item_window AS (ORDER BY purchases)--this does not work:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ORDER BY purchases) AS most_popularFROM ProduceWINDOW item_window AS (ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
-
Ein benanntes Fenster und
PARTITION BY
können nicht zusammen in derwindow-Spezifikation erscheinen. Wenn SiePARTITION BY
, fügen Sie es dem benannten Fenster hinzu. -
Sie können nicht auf ein benanntes Fenster in einer
ORDER BY
-Klausel, einer äußeren Abfrage oder einer Unterabfrage verweisen.
Beispiele für die Verwendung der Fensterspezifikation
Diese Abfragen definieren Partitionen in einer Analysefunktion:
- Eine Zwischensumme berechnen
- Eine kumulative Summe berechnen
- Das beliebteste Element in jeder Kategorie abrufen
- Den letzten Wert in einem Bereich abrufen
- Rang berechnen
- Ein benanntes Fenster in einer window frame-Klausel verwenden
Diese Abfragen enthalten ein benanntes Fenster in einer Fensterspezifikation:
- Den letzten Wert in einem Bereich abrufen
- Benanntes Fenster in einer Fensterrahmenklausel verwenden
Diese Abfragen definieren, wie Zeilen in einer Partition angeordnet werden:
- Berechnen Sie eine Zwischensumme
- Berechnen Sie eine kumulative Summe
- Berechnen Sie einen gleitenden Durchschnitt
- Berechnen Sie die Anzahl der Elemente innerhalb eines Bereichs
- Holen Sie sich das beliebteste Element in jeder Kategorie
- Holen Sie sich den letzten Wert in einem Bereich
- Berechnen Sie den Rang
- Verwenden Sie ein benanntes Fenster in einer window frame-Klausel
h3>
window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }frame_between: { BETWEEN unbounded_preceding AND frame_end_a | BETWEEN numeric_preceding AND frame_end_a | BETWEEN current_row AND frame_end_b | BETWEEN numeric_following AND frame_end_c }frame_start: { unbounded_preceding | numeric_preceding | }frame_end_a: { numeric_preceding | current_row | numeric_following | unbounded_following }frame_end_b: { current_row | numeric_following | unbounded_following }frame_end_c: { numeric_following | unbounded_following }unbounded_preceding: UNBOUNDED PRECEDINGnumeric_preceding: numeric_expression PRECEDINGunbounded_following: UNBOUNDED FOLLOWINGnumeric_following: numeric_expression FOLLOWINGcurrent_row: CURRENT ROW
window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }frame_between: { BETWEEN unbounded_preceding AND frame_end_a | BETWEEN numeric_preceding AND frame_end_a | BETWEEN current_row AND frame_end_b | BETWEEN numeric_following AND frame_end_c }frame_start: { unbounded_preceding | numeric_preceding | }frame_end_a: { numeric_preceding | current_row | numeric_following | unbounded_following }frame_end_b: { current_row | numeric_following | unbounded_following }frame_end_c: { numeric_following | unbounded_following }unbounded_preceding: UNBOUNDED PRECEDINGnumeric_preceding: numeric_expression PRECEDINGunbounded_following: UNBOUNDED FOLLOWINGnumeric_following: numeric_expression FOLLOWINGcurrent_row: CURRENT ROW
Die window frame-Klausel definiert den Fensterrahmen um die aktuelle Zeile mit der Partition, über den die Analysefunktion ausgewertet wird.Nur aggregierte Analysefunktionen können eine Window Frame-Klausel verwenden.
-
rows_range
: Eine Klausel, die einen Fensterrahmen mit physischen Zeilen oder einem logischen Bereich definiert.-
ROWS
: Berechnet den Fensterrahmen basierend auf physikalischen Offsets aus der aktuellen Zeile. Sie können beispielsweise zwei Zeilen vor und nach der aktuellen Zeile einfügen. -
RANGE
: Berechnet den Fensterrahmen basierend auf einem logischen Zeilenbereich um die aktuelle Zeile, basierend auf dem SchlüsselwertORDER BY
der aktuellen Zeile.Der angegebene Bereichswert wird zum Schlüsselwert der aktuellen Zeile addiert oder subtrahiert, um eine Start- oder Endbereichsgrenze für den Fensterrahmen zu definieren. In einem bereichsbasierten Fensterrahmen muss genau ein Ausdruck in derORDER BY
-Klausel vorhanden sein, und der Ausdruck muss einen anumerischen Typ haben.
Tipp: Wenn Sie einen Bereich mit einem Datum verwenden möchten, verwenden Sie
ORDER BY
mit der FunktionUNIX_DATE()
. Wenn Sie einen Bereich mit einem Zeitstempel verwenden möchten, verwenden Sie die FunktionUNIX_SECONDS()
UNIX_MILLIS()
oderUNIX_MICROS()
. -
-
frame_between
: Erzeugt einen Fensterrahmen mit einer unteren und oberen Begrenzung.Die erste Grenze stellt die untere Grenze dar. Die zweite Grenze stellt die obere Grenze dar. Es können nur bestimmte Grenzkombinationen verwendet werden, wie in der vorhergehenden Syntax gezeigt.- Definieren Sie den Anfang des Fensterrahmens mit
unbounded_preceding
numeric_preceding
numeric_following
odercurrent_row
.-
unbounded_preceding
: Der Fensterrahmen beginnt am Anfang der Partition. -
numeric_preceding
odernumeric_following
: Der Anfang des Fensterrahmens ist relativ zur aktuellen Zeile. -
current_row
: Der Fensterrahmen beginnt bei der aktuellen Zeile.
-
- Definieren Sie das Ende des Fensterrahmens mit
numeric_preceding
numeric_following
current_row
oderunbounded_following
.-
numeric_preceding
odernumeric_following
: Das Ende des Fensterrahmens ist relativ zur aktuellen Zeile. -
current_row
: Der Fensterrahmen endet an der aktuellen Zeile. -
unbounded_following
: Der Fensterrahmen endet am Ende der Partition.
-
- Definieren Sie den Anfang des Fensterrahmens mit
-
frame_start
: Erzeugt einen Fensterrahmen mit einer unteren Begrenzung.Der Fensterrahmen endet an der aktuellen Zeile.-
unbounded_preceding
: Der Fensterrahmen beginnt am Anfang der Partition. -
numeric_preceding
: Der Anfang des Fensterrahmens ist relativ zur aktuellen Zeile. -
current_row
: Der Fensterrahmen beginnt bei der aktuellen Zeile.
-
-
numeric_expression
: Ein Ausdruck, der einen numerischen Typ darstellt.Der numerische Ausdruck muss ein konstanter, nicht negativer Ganzzahloder Parameter sein.
Hinweise
Wenn eine Begrenzung über den Anfang oder das Ende einer Partition hinausgeht, enthält der Fensterrahmen nur Zeilen innerhalb dieser Partition.
Sie können keine Fensterrahmenklausel mit Navigationsfunktionen und Nummerierungsfunktionen verwenden, z. B. RANK()
.
Beispiele mit der window frame Klausel
Diese Abfragen berechnen Werte mit ROWS
:
- Berechnen Sie eine kumulative Summe
- Berechnen Sie einen gleitenden Durchschnitt
- Holen Sie sich das beliebteste Element in jeder Kategorie
- Holen Sie sich den letzten Wert in einem Bereich
- Verwenden Sie ein benanntes Fenster in einer Fensterrahmenklausel
Diese Abfragen berechnen Werte mit RANGE
:
- Berechnen
Diese Abfragen berechnen Werte mit einem teilweise oder vollständig ungebundenen Fenster:
- Berechnen Sie eine Gesamtsumme
- Berechnen Sie eine Zwischensumme
- Berechnen Sie eine kumulative Summe
- Holen Sie sich das beliebteste Element in jeder Kategorie
- Compute rank
Diese Abfragen berechnen Werte mit numerischen Grenzen:
- Berechnen Sie eine kumulative Summe
- Berechnen Sie einen gleitenden Durchschnitt
- Berechnen Sie die >Den letzten Wert in einem Bereich abrufen
- Benanntes Fenster in einer window Frame-Klausel verwenden
Diese Abfragen berechnen Werte mit der aktuellen Zeile als Grenze:
- Berechnen Sie eine Gesamtsumme
- Berechnen Sie eine Zwischensumme
- Berechnen Sie eine kumulative Summe
Referenzieren eines benannten Fensters
SELECT query_expr, analytic_function_name ( ) OVER over_clauseFROM from_itemWINDOW named_window_expression over_clause: { named_window | ( ) }window_specification: ] ] named_window_expression: named_window AS { named_window | ( ) }
Ein benanntes Fenster stellt eine Gruppe von Zeilen in einer Tabelle dar, für die eine analytische Funktion verwendet werden soll. Ein benanntes Fenster wird in derWINDOW
-Klausel definiert und in der OVER
einer Analysefunktion referenziert clause.In in einer OVER
-Klausel kann ein benanntes Fenster entweder selbst oder eingebettet in eine Fensterspezifikation angezeigt werden.
Beispiele
- Den letzten Wert in einem Bereich abrufen
- Ein benanntes Fenster in einer Fensterrahmenklausel verwenden
Navigationsfunktionskonzepte
Navigationsfunktionen berechnen im Allgemeinen einigevalue_expression
über eine andere Zeile im Fensterrahmen als die aktuelle Zeile. Die OVER
-Klausel Syntax variiert über Navigationsfunktionen.
Anforderungen für die OVER
Klausel:
-
PARTITION BY
: Optional. -
ORDER BY
:- Disallowed for
PERCENTILE_CONT
andPERCENTILE_DISC
. - Required for
FIRST_VALUE
LAST_VALUE
NTH_VALUE
LEAD
andLAG
.
- Disallowed for
-
window_frame_clause
:- Disallowed for
PERCENTILE_CONT
PERCENTILE_DISC
LEAD
andLAG
. - Optional for
FIRST_VALUE
LAST_VALUE
, andNTH_VALUE
.
- Disallowed for
Für alle Navigationsfunktionen ist der Ergebnisdatentyp derselbe wievalue_expression
.
Konzepte der Nummerierungsfunktion
Nummerierungsfunktionen weisen jeder Zeile ganzzahlige Werte zu, basierend auf ihrer Position innerhalb des angegebenen Fensters.
Beispiel für RANK()
DENSE_RANK()
und ROW_NUMBER()
:
WITH Numbers AS (SELECT 1 as x UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 5 UNION ALL SELECT 8 UNION ALL SELECT 10 UNION ALL SELECT 10)SELECT x, RANK() OVER (ORDER BY x ASC) AS rank, DENSE_RANK() OVER (ORDER BY x ASC) AS dense_rank, ROW_NUMBER() OVER (ORDER BY x) AS row_numFROM Numbers+---------------------------------------------------+| x | rank | dense_rank | row_num |+---------------------------------------------------+| 1 | 1 | 1 | 1 || 2 | 2 | 2 | 2 || 2 | 2 | 2 | 3 || 5 | 4 | 3 | 4 || 8 | 5 | 4 | 5 || 10 | 6 | 5 | 6 || 10 | 6 | 5 | 7 |+---------------------------------------------------+
-
RANK()
: Für x=5 istrank
4, daRANK()
um die Anzahl der Peers in der vorherigen Fensterordnungsgruppe erhöht wird. -
DENSE_RANK()
: Für x=5 istdense_rank
3, daDENSE_RANK()
immererhöht sich um 1 und überspringt niemals einen Wert. -
ROW_NUMBER()
: Für x=5 istrow_num
4.
Aggregate analytic function concepts
Eine Aggregatfunktion ist eine Funktion, die eine Berechnung für eine Reihe von Werten durchführt. Die meisten Aggregatfunktionen können in einer analytischen Funktion verwendet werden. Diese Aggregatfunktionen werden genanntaggregate analytische Funktionen.
Bei aggregierten Analysefunktionen wird die OVER
-Klausel an den Funktionsaufruf aggregate angehängt; die Funktionsaufrufsyntax bleibt ansonsten unverändert.Wie ihre Gegenstücke zur Aggregatfunktion führen diese Analysefunktionen Aggregationen durch, jedoch speziell über den relevanten Fensterrahmen für jede Zeile.Die Ergebnisdatentypen dieser Analysefunktionen sind dieselben wie ihre Gegenstücke zur Aggregatfunktion.
Beispiele für Analysefunktionen
In diesen Beispielen ist das hervorgehobene Element die aktuelle Zeile. Die boldeditems sind die Zeilen, die in der Analyse enthalten sind.
Allgemeine Tabellen, die in Beispielen verwendet werden
Die folgenden Tabellen werden in den nachfolgenden Aggregate analyticquery-Beispielen verwendet: Produce
Employees
und Farm
.
Tabelle erzeugen
Einige Beispiele verweisen auf eine Tabelle mit dem Namen Produce
:
WITH Produce AS (SELECT 'kale' as item, 23 as purchases, 'vegetable' as category UNION ALL SELECT 'orange', 2, 'fruit' UNION ALL SELECT 'cabbage', 9, 'vegetable' UNION ALL SELECT 'apple', 8, 'fruit' UNION ALL SELECT 'leek', 2, 'vegetable' UNION ALL SELECT 'lettuce', 10, 'vegetable')SELECT * FROM Produce+-------------------------------------+| item | category | purchases |+-------------------------------------+| kale | vegetable | 23 || orange | fruit | 2 || cabbage | vegetable | 9 || apple | fruit | 8 || leek | vegetable | 2 || lettuce | vegetable | 10 |+-------------------------------------+
Employees table
Einige Beispiele verweisen auf eine Tabelle mit dem Namen Employees
:
WITH Employees AS (SELECT 'Isabella' as name, 2 as department, DATE(1997, 09, 28) as start_date UNION ALL SELECT 'Anthony', 1, DATE(1995, 11, 29) UNION ALL SELECT 'Daniel', 2, DATE(2004, 06, 24) UNION ALL SELECT 'Andrew', 1, DATE(1999, 01, 23) UNION ALL SELECT 'Jacob', 1, DATE(1990, 07, 11) UNION ALL SELECT 'Jose', 2, DATE(2013, 03, 17))SELECT * FROM Employees+-------------------------------------+| name | department | start_date |+-------------------------------------+| Isabella | 2 | 1997-09-28 || Anthony | 1 | 1995-11-29 || Daniel | 2 | 2004-06-24 || Andrew | 1 | 1999-01-23 || Jacob | 1 | 1990-07-11 || Jose | 2 | 2013-03-17 |+-------------------------------------+
Farm table
Einige Beispiele verweisen auf eine Tabelle mit dem Namen Farm
:
WITH Farm AS (SELECT 'cat' as animal, 23 as population, 'mammal' as category UNION ALL SELECT 'duck', 3, 'bird' UNION ALL SELECT 'dog', 2, 'mammal' UNION ALL SELECT 'goose', 1, 'bird' UNION ALL SELECT 'ox', 2, 'mammal' UNION ALL SELECT 'goat', 2, 'mammal')SELECT * FROM Farm+-------------------------------------+| animal | category | population |+-------------------------------------+| cat | mammal | 23 || duck | bird | 3 || dog | mammal | 2 || goose | bird | 1 || ox | mammal | 2 || goat | mammal | 2 |+-------------------------------------+
Berechnen Sie eine Gesamtsumme
Dies berechnet eine Gesamtsumme für alle Elemente in derProduce
Tabelle.
- (orange, Apfel, Lauch, kohl, Salat, Grünkohl) = 54 Gesamteinkäufe
- (orange, Apfel, Lauch, kohl, salat, Grünkohl) = 54 Gesamteinkäufe
- (orange, Apfel, Lauch, Kohl, Salat, Grünkohl) = 54 Gesamteinkäufe
- (orange, Apfel, Lauch, Kohl, Salat, Grünkohl) = 54 Gesamteinkäufe
- (orange, Apfel, Lauch, kohl, Salat, Grünkohl) = 54 Gesamtkäufe
- (Orange, Apfel, Lauch, Kohl, Salat, Grünkohl) = 54 Gesamtkäufe
SELECT item, purchases, category, SUM(purchases) OVER () AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 54 || leek | 2 | vegetable | 54 || apple | 8 | fruit | 54 || cabbage | 9 | vegetable | 54 || lettuce | 10 | vegetable | 54 || kale | 23 | vegetable | 54 |+-------------------------------------------------------+
Berechnen Sie eine Zwischensumme
Dies berechnet eine Zwischensumme für jede Kategorie im
Produce
Tabelle.
- Obst
- (orange, Apfel) = 10 Gesamteinkäufe
- (orange, Apfel) = 10 Gesamteinkäufe
- Gemüse
- (Lauch, Kohl, Salat, Grünkohl) = 44 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 44 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 44 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 44 gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 44 Gesamteinkäufe
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 10 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 44 || cabbage | 9 | vegetable | 44 || lettuce | 10 | vegetable | 44 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Berechnen Sie eine kumulative Summe
Dies berechnet eine kumulative Summe für jede Kategorie in der TabelleProduce
. Die Summe wird in Bezug auf den mit der ORDER BY
-Klausel definierten Theorem berechnet.
- Obst
- (Orange, Apfel) = 2 Gesamteinkäufe
- (Orange, Apfel) = 10 Gesamteinkäufe
- Gemüse
- (Lauch, Kohl, Salat, Grünkohl) = 2 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 11 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 21 Gesamteinkäufe
- (Lauch, Kohl, Salat, Grünkohl) = 44 Gesamtkäufe
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 2 || cabbage | 9 | vegetable | 11 || lettuce | 10 | vegetable | 21 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Dies macht dasselbe wie das vorhergehende Beispiel. Sie müssenCURRENT ROW
nicht als Grenze hinzufügen, es sei denn, Sie möchten dies aus Gründen der Lesbarkeit.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
In diesem Beispiel sind alle Elemente in der Produce
-Tabelle in der Partition enthalten. Nur vorhergehende Zeilen werden analysiert. Die Analyse beginnt zwei Zeilen vor der aktuellen Zeile in der Partition.
- (orange, Lauch, apfel, kohl, salat, Grünkohl) = NULL
- (orange, lauch, apfel, kohl, salat, grünkohl) = NULL
- (orange, Lauch, apfel, kohl, Salat, Grünkohl) = 2
- (orange, Lauch, Apfel, kohl, Salat, Grünkohl) = 4
- (orange, Lauch, Apfel, kohl, Salat, Grünkohl) = 12
- (Orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = 21
SELECT item, purchases, category, SUM(purchases) OVER ( ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING ) AS total_purchasesFROM Produce;+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | NULL || leek | 2 | vegetable | NULL || apple | 8 | fruit | 2 || cabbage | 9 | vegetable | 4 || lettuce | 10 | vegetable | 12 || kale | 23 | vegetable | 21 |+-------------------------------------------------------+
Berechnen Sie einen gleitenden Durchschnitt
Dies berechnet einen gleitenden Durchschnitt in der Produce
Tabelle.Die untere Grenze ist 1 Zeile vor der aktuellen Zeile. Die obere Grenze ist 1 Zeile nach der aktuellen Zeile.
- (orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = 2 durchschnittliche Einkäufe
- (orange, Lauch, apfel, kohl, Salat, Grünkohl) = 4 durchschnittliche Einkäufe
- (orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = 6.3333 durchschnittliche Einkäufe
- (orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = 9 durchschnittliche Einkäufe
- (orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = , kohl, Salat, Grünkohl) = 14 durchschnittliche Einkäufe
- (Orange, Lauch, Apfel, Kohl, Salat, Grünkohl) = 16.5 durchschnittliche Einkäufe
SELECT item, purchases, category, AVG(purchases) OVER ( ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS avg_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | avg_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || leek | 2 | vegetable | 4 || apple | 8 | fruit | 6.33333 || cabbage | 9 | vegetable | 9 || lettuce | 10 | vegetable | 14 || kale | 23 | vegetable | 16.5 |+-------------------------------------------------------+
Berechnen Sie die Anzahl der Artikel innerhalb eines Bereichs
In diesem Beispiel wird die Anzahl der Tiere mit einer ähnlichen Populationcount in der Tabelle Farm
abgerufen.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 4 Tiere zwischen Populationsbereich 0-2.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 5 Tiere zwischen Populationsbereich 1-3.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 5 Tiere zwischen Populationsbereich 1-3.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 5 Tiere zwischen Populationsbereich 1-3.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 4 Tiere zwischen Populationsbereich 2-4.
- (Gans, Hund, Ochse, Ziege, Ente, Katze) = 1 Tier zwischen Populationsbereich 22-24.
SELECT animal, population, category, COUNT(*) OVER ( ORDER BY population RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS similar_populationFROM Farm;+----------------------------------------------------------+| animal | population | category | similar_population |+----------------------------------------------------------+| goose | 1 | bird | 4 || dog | 2 | mammal | 5 || ox | 2 | mammal | 5 || goat | 2 | mammal | 5 || duck | 3 | bird | 4 || cat | 23 | mammal | 1 |+----------------------------------------------------------+
Holen Sie sich das beliebteste Element in jeder Kategorie
Dieses Beispiel ruft das beliebteste Element in jeder Kategorie ab. Es definiert, wie Zeilen in einem Fenster in jeder Partition partitioniert und geordnet werden. DieProduce
-Tabelle wird referenziert.
- Obst
- (orange, Apfel) = Apfel ist am beliebtesten
- (orange, Apfel) = Apfel ist am beliebtesten
- Gemüse
- (Lauch, Kohl, Salat, Grünkohl) = Grünkohl ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = Grünkohl ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = grünkohl ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = Grünkohl ist am beliebtesten
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | kale || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
Holen Sie sich den letzten Wert in einem Bereich
In diesem Beispiel wird das beliebteste Element in einem bestimmten Fensterrahmen mithilfe des Produce
Tabelle. Der Fensterrahmen analysiert bis zu dreibögen gleichzeitig. Schauen Sie sich die most_popular
Spalte für Gemüse genau an.Anstatt den beliebtesten Artikel in einer bestimmten Kategorie zu erhalten, wird der beliebteste Artikel in einem bestimmten Bereich in dieser Kategorie angezeigt.
- Obst
- (orange, Apfel) = Apfel ist am beliebtesten
- (orange, Apfel) = Apfel ist am beliebtesten
- Gemüse
- (Lauch, Kohl, Salat, Grünkohl) = Kohl ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = Salat ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = Grünkohl ist am beliebtesten
- (Lauch, Kohl, Salat, Grünkohl) = Grünkohl ist am beliebtesten
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | cabbage || cabbage | 9 | vegetable | lettuce || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
Dieses Beispiel liefert die gleichen Ergebnisse wie das vorhergehende Beispiel, enthält jedoch ein benanntes Fenster mit dem Namen item_window
. Einige der Fensterspezifikationen sind direkt in der OVER
-Klausel definiert und einige sind im benannten Fenster definiert.
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases)
Compute rank
In diesem Beispiel wird der Rang jedes Mitarbeiters innerhalb seiner Abteilung basierend auf seinem Startdatum berechnet. Die Fensterspezifikation wird direkt in der OVER
-Klausel definiert. Die Employees
-Tabelle wird referenziert.
- Abteilung 1
- (Jacob, Anthony, Andrew) = Jacob Rang 1 zuweisen
- (Jacob, Anthony, Andrew) = Anthony Rang 2 zuweisen
- (Jacob, Anthony, Andrew) = Andrew Rang 3 zuweisen
- Abteilung 2
- (Isabella, Daniel, Jose) = Isabella Rang 1 zuweisen
- (Isabella, Daniel, Jose) = Isabella Rang 2 zuweisen Daniel
- (Isabella, Daniel, Jose) = Ordnen Sie Jose Rang 3 zu
SELECT name, department, start_date, RANK() OVER (PARTITION BY department ORDER BY start_date) AS rankFROM Employees;+--------------------------------------------+| name | department | start_date | rank |+--------------------------------------------+| Jacob | 1 | 1990-07-11 | 1 || Anthony | 1 | 1995-11-29 | 2 || Andrew | 1 | 1999-01-23 | 3 || Isabella | 2 | 1997-09-28 | 1 || Daniel | 2 | 2004-06-24 | 2 || Jose | 2 | 2013-03-17 | 3 |+--------------------------------------------+
Verwenden Sie ein benanntes Fenster in einer Fensterrahmenklausel
Sie können einen Teil Ihrer Logik in einem benannten Fenster und einen Teil awindow frame-Klausel. Diese Logik wird kombiniert. Hier ist ein Beispiel mit derProduce
-Tabelle.
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)+-------------------------------------------------------+| item | purchases | category | most_popular |+-------------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | lettuce || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+-------------------------------------------------------+
Sie können die vorherigen Ergebnisse auch mit diesen Beispielen erhalten:
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), c AS (b ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING), item_window AS (c)
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), item_window AS (b)
Das folgende Beispiel erzeugt einen Fehler, weil eine window frame Klausel zweimal definiert wurde:
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Leave a Reply