Spezifische Verwendung von MySQL-Fensterfunktionen

Spezifische Verwendung von MySQL-Fensterfunktionen

Ich habe zuvor eine Umfrage für meine Fans durchgeführt, um den最熟悉的陌生人in MySQL zu finden~~Welche technischen Punkte in MySQL sind Ihnen sowohl vertraut als auch unbekannt?

Die Top Drei entsprechen so ziemlich meinen Erwartungen, und zwar:

1. Cursor 2. Fensterfunktion 3. Clustered-Index

Obwohl diese drei Punkte im täglichen Leben selten verwendet werden,面試中卻常被問到. Erwähnenswert ist, dass viele Interviewer nur eine vage Vorstellung von den Fragen haben. .

Heute möchte ich mit Ihnen über Fensterfunktionen sprechen. MySQL從8.0開始支持窗口函數. Vielleicht ist die MySQL-Version Ihres Unternehmens noch nicht zufriedenstellend, aber ich schlage vor, Sie probieren eine lokal aus. Sie ist wirklich großartig!

Bildbeschreibung hier einfügen

Okay, ohne weitere Umschweife beginnen wir wie üblich mit der Vorspeise und schauen uns die Daten der heutigen Testtabelle an.

Die in diesem Artikel zur Demonstration verwendete Testtabelle ist chh_baozipu , was „ähm … Chen Hahas Baozi-Shop“ bedeutet. Lassen Sie mich Ihnen ein Geheimnis verraten: Bruder Ha hat dieses Jahr einen Dampfbrötchenladen eröffnet und diese Tabelle zeigt den Gewinn des Dampfbrötchenladens in den letzten sechs Monaten ~

mysql> AUSWÄHLEN * von chh_baozipu;
+----+--------------------+-------+---------+
| ID | Produkt | Umsatz | Monat |
+----+--------------------+-------+---------+
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 |
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 |
+----+--------------------+-------+---------+
12 Zeilen im Satz (0,00 Sek.)

Wie sagt man es? Kommen Sie einmal in meinen Laden und ich verwöhne Sie alle mit mit Weizen gefüllten Brötchen.

1. Was ist eine Fensterfunktion?

1. Wie ist das Fenster zu verstehen?

Tatsächlich ist das Konzept des窗口sehr wichtig. Wenn wir Fensterfunktionen lernen wollen, können wir nicht nur das eine wissen, aber das andere nicht; wir müssen herausfinden, was窗口darstellt, damit wir wissen, wann wir es verwenden müssen.

Nehmen wir die Testtabelle als Beispiel und erstellen einige Statistiken:包子鋪的豬肉大蔥包子這半年截至每月累計利潤.

SELECT *,SUM(Umsatz) über(ORDER BY „Monat“) als kumulativen Gewinn von chh_baozipu, wobei Produkt=„Brötchen mit Schweinefleisch und Frühlingszwiebeln“;
mysql> SELECT *,SUM(Umsatz) über(ORDER BY „Monat“) als kumulierter Gewinn von chh_baozipu, wobei Produkt=„Brötchen mit Schweinefleisch und Frühlingszwiebeln“;
+----+--------------------+-------+---------+--------------+
| ID | Produkt | Umsatz | Monat | kumulierter Gewinn|
+----+--------------------+-------+---------+--------------+
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2600 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 4400 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 6000 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 6600 |
+----+--------------------+-------+---------+--------------+
6 Zeilen im Satz (0,00 Sek.)

Aus dieser SQL-Anweisung können wir ersehen, dass窗口für die erste Zeile mit der ID=6 die erste Zeile ist,窗口für die zweite Zeile mit der ID=5 die ersten beiden Zeilen und so weiter (wie in der Abbildung unten gezeigt).

Bildbeschreibung hier einfügen

Es ist ersichtlich窗口就是范圍的意思, der als Sammlung von Datensätzen (Zeilen) verstanden werden kann; die Fensterfunktion ist eine spezielle Funktion, die滿足某種條件的記錄集合上執行計算.

Für jeden Datensatz muss innerhalb dieses Fensters eine Funktion ausgeführt werden. Bei manchen Funktionen ist die Fenstergröße abhängig vom Datensatz festgelegt, es handelt sich also um靜態窗口. Bei manchen Funktionen hingegen entsprechen unterschiedliche Datensätze unterschiedlichen Fenstern. Dieses sich dynamisch ändernde Fenster wird滑動窗口bezeichnet. Ich glaube, dass Sie diesen Satz nach der Lektüre dieses Artikels [Hundekopf] besser verstehen werden.

2. Was ist eine Fensterfunktion?

Fensterfunktionen werden auch OLAP函數(Online Analytical Processing) genannt und ermöglichen die Analyse und Verarbeitung von Daten in Echtzeit.

In welchen Szenarien werden Fensterfunktionen am häufigsten verwendet? Es gibt zwei Hauptkategorien:

  • Ranking-Probleme, z. B.: Überprüfen Sie das monatliche Gewinnranking eines Dampfbrötchenladens;
  • TOPN-Fragen, zum Beispiel: Finden Sie die zwei Monate mit dem höchsten Gewinn für jede Brötchensorte;

Unsere gängigen Fensterfunktionen und Aggregatfunktionen sind:

  • Spezialisierte Fensterfunktionen: rank() , dense_rank() , row_number()
  • Aggregatfunktionen: max() , min() , count() , sum() , avg()

Da Aggregatfunktionen auch in Fensterfunktionen verwendet werden können, werden Fensterfunktionen und normale Aggregatfunktionen leicht verwechselt. Die Unterschiede zwischen den beiden sind wie folgt:

  • 聚合函數多條記錄聚合為一條, während Fensterfunktionen每條記錄都會執行,有幾條記錄執行完還是幾條.
  • Aggregatfunktionen können auch in Fensterfunktionen verwendet werden, was ich anhand eines Beispiels verdeutlichen werde.

2. Verwendung von Fensterfunktionen

Grundlegende Syntax:

<Fensterfunktion> OVER (PARTITION BY <Spaltenname für Gruppierung> ORDER BY <Spaltenname für Sortierung>);
-- Das Schlüsselwort „over“ wird verwendet, um den Fensterbereich der Funktion anzugeben.
--Partitionierung wird zum Gruppieren von Tabellen verwendet.
-- Die Order-By-Klausel wird zum Sortieren der gruppierten Ergebnisse verwendet.

Hinweis: Die Fensterfunktion führt eine sekundäre Operation auf dem Ergebnis der Where- oder Group-By-Klausel aus. Daher wird sie in der Reihenfolge der SQL-Anweisungen ausgeführt. Die Fensterfunktion wird normalerweise in der Select-Klausel (vor der From-Klausel) platziert. Sie können beispielsweise die vorherige SQL-Anweisung nach oben ziehen, um sie anzuzeigen~

Was sind die Fensterfunktionen? Ich bin zu faul zum Zeichnen, also leihe ich mir die Karte von lulin916 ~~

Bildbeschreibung hier einfügen

  • Ordinalfunktion: row_number() / rank() / dense_rank()
  • Verteilungsfunktion: percent_rank() / cume_dist()
  • Vorher- und Nachher-Funktionen: lag() / lead()
  • Kopf- und Endfunktionen: first_val() / last_val()
  • Andere Funktionen: nth_value() / nfile()

Schauen wir uns einige Beispiele an:

1. Ordinalfunktion: row_number() / rank() / dense_rank()

ROW_NUMBER(): Sequentielle Sortierung - 1, 2, 3

RANK(): Parallel sortieren, doppelte Zahlen überspringen - 1, 1, 3

DENSE_RANK(): parallele Sortierung, ohne doppelte Zahlen zu überspringen - 1, 1, 2

mysql> SELECT *,ROW_NUMBER() over(ORDER BY sales desc) as pro_ROW_NUMBER,rank() over(ORDER BY sales desc) as pro_rank,DENSE_RANK() over(ORDER BY sales desc) as pro_DENSE_RANK from chh_baozipu where product='Brötchen mit Schweinefleisch und Frühlingszwiebeln';
+----+--------------------+-------+---------+----------------+----------+----------------+
| ID | Produkt | Umsatz | Monat | pro_ROW_NUMBER | pro_rank | pro_DENSE_RANK |
+----+--------------------+-------+---------+----------------+----------+----------------+
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1 | 1 | 1 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2 | 1 | 1 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3 | 3 | 2 |
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 4 | 3 | 2 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 5 | 5 | 3 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 6 | 6 | 4 |
+----+--------------------+-------+---------+----------------+----------+----------------+
6 Zeilen im Satz (0,00 Sek.)

Wie aus den obigen Beispielen ersichtlich ist, erfüllen die drei Fensterfunktionen drei verschiedene typische Geschäftsanforderungen, die für die Handhabung unserer Sortierstatistiken ausreichen.

Wenn Studierende in Zukunft in Interviews oder schriftlichen Tests gefragt werden, sprechen Sie bitte nicht über Low-Level-Lösungen wie Self-Query-Nesting, andernfalls sagen Sie nicht, dass Sie mich kennen ~ Hunde

2. Verteilungsfunktion: percent_rank() / cume_dist()

Da diese Verteilungsfunktion grundsätzlich nicht genutzt wird, gehen wir hier nicht näher darauf ein. Interessierte Studenten können Baidu selbst durchsuchen ~

3. Vorher- und Nachher-Funktion: lag(expr,n) / lead(expr,n)

expr wird später erwähnt, also lassen Sie es mich einheitlich erklären: expr kann表達式oder列名sein

Die Funktionen „Before“ und „After“ werden häufig verwendet, um den Wert von expr in前n行(LAG(expr,n))或后n行(LEAD(expr,n)) aktuellen Zeile zurückzugeben.

Anwendungsszenario: Abfrage der Differenz zwischen den Punktzahlen der besten n Schüler und der Punktzahl des aktuellen Schülers

Das innere SQL verwendet zuerst die Funktion LAG(), um die Punktzahl des vorherigen Schülers zu ermitteln, und das äußere SQL subtrahiert dann die Punktzahlen des aktuellen Schülers und des vorherigen Schülers, um die Punktzahldifferenz zu erhalten.

Es wäre etwas umständlich, hier die Testtabelle von Ha Ge zu verwenden. . Aber du weißt bestimmt, was ich meine. Schauen wir es uns an:

mysql> SELECT *, lag(Umsatz,1) über Gewinn als pro_lag, lead(Umsatz,1) über Gewinn als pro_lead von chh_baozipu WINDOW Gewinn als (PARTITION BY Produkt ORDER BY Umsatz desc);
+----+--------------------+-------+---------+---------+----------+
| ID | Produkt | Umsatz | Monat | Pro_Lag | Pro_Lead |
+----+--------------------+-------+---------+---------+----------+
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | NULL | 1600 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1600 | 1000 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1600 | 1000 |
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | 800 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1000 | 600 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 800 | NULL |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | NULL | 300 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 700 | 200 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 300 | 200 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 | 100 |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 200 | 0 |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 100 | NULL |
+----+--------------------+-------+---------+---------+----------+
12 Zeilen im Satz (0,00 Sek.)

Hier möchte ich die Studierenden fragen, ob ihnen aufgefallen ist, dass dieses SQL anders ist als das vorherige SQL? Was sind die Unterschiede?

WÄHLEN *,
lag(sales,1) über win als pro_lag,
Lead(Sales,1) über Win als Pro_Lead
von chh_baozipu, wobei Produkt = „Brötchen mit Schweinefleisch und Frühlingszwiebeln“ 
WINDOW gewinnt als (PARTITION NACH Produkt, ORDER NACH Verkaufsabstieg);

1.把窗口提取出來設置了別名

Tatsächlich öffnet diese Methode das Fenster und設置別名為:win , genau wie wir Aliase beim Schreiben von SQL verwenden. Das sieht doch einfacher und komfortabler aus, oder?

Hat jemand Programmierer gefragt, welche Einfachheit sie sich wünschen? Andere werden Ihren Code großartig finden, auch wenn sie ihn nicht verstehen. Es ist offensichtlich, dass diese Art von Schülern von der Gesellschaft nie geschlagen wurde. Wenn Sie auf den Ahnenkodex stoßen, der alle hundert Jahre einmal auftaucht, werden Sie verstehen, was Einfachheit ist (um das Bild von Fat Brother auszuleihen).

Bildbeschreibung hier einfügen

2. PARTITION BY product zum Fenster hinzugefügt

Dieses Schlüsselwort in der over-Klausel bedeutet, dass der Inhalt des Fensters gesteuert wird. In der grundlegenden Syntax oben habe ich Ihnen gesagt, dass over zwei Schlüsselwörter enthält:

  • partition by dient zum Gruppieren des Fensterinhalts;
  • order by werden die Fensterinhalte nach der Gruppierung sortiert.

Tatsächlich gibt es interessantere Möglichkeiten, den Fensterbereich zu steuern ~~

Es gibt zwei Möglichkeiten滑動窗口的范圍指定: zeilenbasiert und bereichsbasiert. Ich werde mich auf die häufig verwendete基于行zur Steuerung des Fensterbereichs konzentrieren.

Die Syntax BETWEEN frame_start AND frame_end wird normalerweise verwendet, um einen Zeilenbereich anzugeben. frame_start und frame_end können die folgenden Schlüsselwörter unterstützen, um verschiedene dynamische Zeilendatensätze zu identifizieren:

  • AKTUELLE ZEILE Die Grenze ist die aktuelle Zeile, die normalerweise mit anderen Bereichsschlüsselwörtern verwendet wird
  • UNBOUNDED PRECEDING Die Grenze ist die erste Zeile in der Partition
  • UNBOUNDED FOLLOWING Die Grenze ist die letzte Zeile in der Partition
  • expr PRECEDING Die Grenze ist die aktuelle Zeile minus dem Wert von expr
  • expr FOLGEND Die Grenze ist die aktuelle Zeile plus der Wert von expr

Schauen wir uns einige Beispiele an:

① Berechnen Sie die aggregierte Fensterfunktion der aktuellen Zeile und der vorherigen n Zeilen (insgesamt n + 1 Zeilen).

Im folgenden Beispiel ist die Kontrollfenstergröße die Summe der Gewinne des aktuellen Monats + der vorherigen beiden Monate. Schauen wir uns die Auswirkung an:

SELECT *,SUM(sales) OVER win als „Summe der Gewinne der letzten drei Monate“
VON chh_baozipu 
WINDOW win as (PARTITION BY Produkt ORDER BY „Monat“ ZEILEN 2 VORHERGEHENDE);
mysql> SELECT *,SUM(sales) OVER win als 'Summe der Gewinne der letzten drei Monate'
    -> VON chh_baozipu 
	-> WINDOW win as (PARTITION BY Produkt ORDER BY „Monat“ ZEILEN 2 VORHERGEHENDE);
+----+--------------------+-------+---------+--------------------------+
| ID | Produkt | Umsatz | Monat | Gesamtgewinn der letzten drei Monate |
+----+--------------------+-------+---------+--------------------------+
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 2600 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3400 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 3400 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 3200 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 300 |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 300 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 400 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 500 |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 1200 |
+----+--------------------+-------+---------+--------------------------+
12 Zeilen im Satz (0,00 Sek.)

② Berechnen Sie die aggregierte Fensterfunktion der aktuellen Zeile, der ersten n1 Zeilen und der letzten n2 Zeilen

Im folgenden Beispiel ist die Kontrollfenstergröße die Summe der Gewinne aus dem Monat vor und dem Monat nach dem aktuellen Monat. Schauen wir uns die Auswirkung an:

SELECT *,SUM(sales) OVER win als „Summe der Gewinne der ersten drei Monate“ 
VON chh_baozipu 
WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN n1 PRECEDING AND n2 FOLLOWING);
mysql> SELECT *,SUM(sales) OVER win as 'Summe der Gewinne vom vorherigen Monat bis zum nächsten Monat' FROM chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
+----+--------------------+-------+---------+--------------------------+
| ID | Produkt | Umsatz | Monat | Summe der Gewinne vom Vormonat zum Folgemonat|
+----+--------------------+-------+---------+--------------------------+
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 2600 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 3400 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 3400 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 3400 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 3200 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 2200 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 300 |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 300 |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 400 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 500 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 1200 |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 900 |
+----+--------------------+-------+---------+--------------------------+
12 Zeilen im Satz (0,00 Sek.)

4. Kopf- und Endfunktionen: FIRST_VALUE(expr), LAST_VALUE(expr)

Die Kopf- und Schwanzfunktionen werden verwendet, um: den ersten oder letzten Wert von expr zurückzugeben;

Anwendungsszenario: Abfrage當前最大月收入und當前最小月收入nach Datumssortierung ab sofort möglich.

WÄHLEN *,
FIRST_VALUE(Umsatz) über Gewinn als „Aktuelles maximales Monatseinkommen“,
LAST_VALUE(Umsatz) über Gewinn als „Aktuelles monatliches Mindesteinkommen“ 
von chh_baozipu 
WINDOW win as (PARTITION NACH Produkt ORDER BY „Monat“);
mysql> SELECT *,FIRST_VALUE(Umsatz) über Win als „Aktuelles maximales Monatseinkommen“,LAST_VALUE(Umsatz) über Win als „Aktuelles minimales Monatseinkommen“ von chh_baozipu WINDOW Win als (PARTITION BY Produkt ORDER BY „Monat“);
+----+--------------------+-------+---------+--------------------------+-------------------------+
| ID | Produkt | Umsatz | Monat | Aktuelles maximales Monatseinkommen | Aktuelles minimales Monatseinkommen |
+----+--------------------+-------+---------+--------------------------+-------------------------+
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | 1000 | 1000 |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1000 | 1600 |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1000 | 800 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1000 | 1000 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1000 | 1600 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 1000 | 600 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | 200 | 200 |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 200 | 100 |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 200 | 0 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 200 | 300 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 200 | 200 |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 200 | 700 |
+----+--------------------+-------+---------+--------------------------+-------------------------+
12 Zeilen im Satz (0,00 Sek.)

5. Andere Funktionen: nth_value() / nfile()

nfile() wird nicht häufig verwendet, daher gehen wir hier nicht ins Detail; hier erwähnen wir nur NTH_VALUE(expr,n) .

NTH_VALUE Zweck: Gibt den Wert des n-ten Ausdrucks im Fenster zurück.

Anwendungsszenario: Ab sofort werden die Gewinne des zweiten und dritten Platzes in der monatlichen Gewinnliste von Chen Haha Steamed Bun Shop angezeigt.

WÄHLEN *,
nth_value(sales,2) über win als 'derzeit zweithöchstes Monatseinkommen',
nth_value(sales,3) über win als „Aktueller Dritter beim monatlichen Einkommen“ 
von chh_baozipu 
WINDOW win as (PARTITION NACH Produkt ORDER BY „Monat“);
mysql> SELECT *, nth_value(sales,2) over win as 'Aktuell auf Platz 2 beim Monatseinkommen', nth_value(sales,3) over win as 'Aktuell auf Platz 3 beim Monatseinkommen' from chh_baozipu WINDOW win as (PARTITION BY product ORDER BY `month`);
+----+--------------------+-------+---------+--------------------------------+--------------------------------+
| ID | Produkt | Umsatz | Monat | Aktuelles zweitrangiges Monatseinkommen | Aktuelles drittrangiges Monatseinkommen |
+----+--------------------+-------+---------+--------------------------------+--------------------------------+
| 6 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-06 | NULL | NULL |
| 5 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-07 | 1600 | NULL |
| 4 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 800 | 2021-08 | 1600 | 800 |
| 3 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1000 | 2021-09 | 1600 | 800 |
| 2 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 1600 | 2021-10 | 1600 | 800 |
| 1 | Brötchen mit Schweinefleisch und Frühlingszwiebeln | 600 | 2021-11 | 1600 | 800 |
| 12 | Mit Weizen gefüllte Brötchen | 200 | 2021-06 | NULL | NULL |
| 11 | Mit Weizen gefüllte Brötchen | 100 | 2021-07 | 100 | NULL |
| 10 | Mit Weizen gefüllte Brötchen | 0 | 2021-08 | 100 | 0 |
| 9 | Mit Weizen gefüllte Brötchen | 300 | 2021-09 | 100 | 0 |
| 8 | Mit Weizen gefüllte Brötchen | 200 | 2021-10 | 100 | 0 |
| 7 | Mit Weizen gefüllte Brötchen | 700 | 2021-11 | 100 | 0 |
+----+--------------------+-------+---------+--------------------------------+--------------------------------+
12 Zeilen im Satz (0,00 Sek.)

Kapitelzusammenfassung

Das ist alles, was ich zu Fensterfunktionen zu sagen habe. Fensterfunktionen sind etwas Neues, das ich entdeckt habe, nachdem ich mit MySQL 8 in Berührung gekommen bin. Plötzlich habe ich das Gefühl, dass das MySQL-Entwicklungsteam immer noch sehr kreativ ist. Jede Version fügt einige neue Spielmöglichkeiten hinzu, die natürlich sehr praktisch sind. Ich hoffe, dass MySQL 9.0 uns noch mehr Überraschungen bringen wird.

Dies ist das Ende dieses Artikels über die spezifische Verwendung von MySQL-Fensterfunktionen. Weitere relevante Inhalte zu MySQL-Fensterfunktionen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Mysql8.0 verwendet Fensterfunktionen, um Sortierprobleme zu lösen
  • Einführung und Zusammenfassung der MySQL 8.0-Fensterfunktionen
  • Fallanalyse von SQL-Fensterfunktionen zur Erzielung einer effizienten Paging-Abfrage
  • Lernen Sie schnell etwas über SQL-Fensterfunktionen

<<:  Lösung für das Problem der großen Schriftgröße auf iPhone-Geräten in WAP-Seiten

>>:  Vue + ElementUI implementiert Paging-Funktion - MySQL-Daten

Artikel empfehlen

JS realisiert die Berechnung des Gesamtpreises der Waren im Warenkorb

JS berechnet den Gesamtpreis der Waren im Warenko...

HTML ist etwas, das Webseiten-Ersteller lernen und beherrschen müssen.

Welche Vorteile bietet das Erlernen von HTML? 1: ...

Details zum MySQL-Index-Pushdown

Inhaltsverzeichnis 1. Prinzip des ganz linken Prä...

MySQL fragt den aktuellsten Datensatz der SQL-Anweisung ab (Optimierung)

Die schlechteste Option besteht darin, die Ergebn...

Detaillierte Erläuterung des zeitgesteuerten Protokollschneidens von Nginx

Vorwort Standardmäßig werden Nginx-Protokolle in ...

Tutorial zur Verwendung von Webpack in JavaScript

Inhaltsverzeichnis 0. Was ist Webpack 1. Einsatz ...

Vue.js implementiert das Neun-Raster-Bildanzeigemodul

Ich habe Vue.js verwendet, um ein Bildanzeigemodu...

Vergleich zweier Implementierungsmethoden der Vue-Dropdown-Liste

Zwei Implementierungen der Vue-Dropdown-Liste Die...

Spezifische Verwendung von Linux which Befehl

Oft möchten wir in Linux eine Datei finden, wisse...