Ausführliche Erläuterung der HIVE-SQL-Aggregatfunktion und der Zeilen zwischen / Bereich zwischen

1. Verwendung von Zeilen dazwischen und Bereich dazwischen

1. Analyse relevanter Schlüsselwörter

unbounded 无边界
preceding 往前
following 往后
unbounded preceding 往前所有行,即初始行
n preceding 往前n行
unbounded following 往后所有行,即末尾行
n following 往后n行
current row 当前行

语法
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING

2. Reihen zwischen ... und ...

Zeilen: Bezieht sich auf den Bereich des Frames, der durch die Zeilennummer bestimmt wird, was im physischen Sinne eine Zeile ist.

Beispielsweise stellen Zeilen zwischen der ersten und der folgenden Zeile eine Zeile vor und eine Zeile nach der aktuellen Zeile dar.

3. Bereich zwischen ... und ...

Bereich: Bezieht sich auf den Wert der aktuellen Zeile in der Fensterfunktion als Basis, sortiert dann nach Reihenfolge und addiert und subtrahiert schließlich die Ober- und Untergrenze entsprechend dem Bereich. ist eine logische Zeile.

Zum Beispiel bedeutet sum(score) over (PARTITION by id order by score BETWEEN 1 PRECEDING AND 1 FOLLOWING) Gruppieren nach ID, Sortieren nach Score in aufsteigender Reihenfolge und dann Nehmen des Scores der aktuellen Zeile, Subtrahieren von eins von der Untergrenze und Addieren von eins zur Obergrenze als Bereich und Summieren der Scores in diesem Bereich.

Es ist ein bisschen langatmig, also sehen wir uns zum Verständnis ein Beispiel an.

Zweitens Beispiele

1. Datenaufbereitung

Angenommen, es gibt eine Tabelle datadev.t_student, die Daten lauten wie folgt

Ausweis Punktzahl
stu_1 1
stu_1 2
stu_1 3
stu_1 4
stu_1 5
stu_1 5

2. Testreihen  zwischen ... und ...

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a3,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a4,
sum(score) over (PARTITION by id order by 1) as a5
from datadev.t_student;

Die Testergebnisse sind wie folgt:

analysieren:

  1. sum(score) over (PARTITION by id) as a1: Gruppieren Sie nach ID, um die Ergebnisse direkt zu addieren, was jedem am vertrautesten ist
  2. sum(score) über (PARTITION nach ID, Reihenfolge nach Score) als a2: Nach Score sortieren und von der Startzeile bis zur aktuellen Zeile addieren. Der Unterschied zu ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW in a3 besteht darin, dass bei gleichem Score die gleiche Rangfolge gezählt und addiert wird. Ähnlich dem Konzept des Ranges.
  3. sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW): Summiert von der Startzeile bis zur aktuellen Zeile. Im Gegensatz zu a2 sind die Rangfolgen bei gleicher Punktzahl unterschiedlich und werden nicht zur aktuellen Zeile summiert. Ähnlich dem Konzept von row_number.
  4. sum(score) over (PARTITION nach ID, Reihenfolge nach Punktzahl ZEILEN ZWISCHEN UNBEGRENZTEN VORHERIGEN UND UNBEGRENZTEN FOLGENDEN): Summe von der Startzeile bis zur Endzeile, dasselbe wie a1.
  5. sum(score) over (PARTITION by id order by 1): Die Funktion ist die gleiche wie die von a2, wobei order by 1 der gleichen Punktzahl entspricht, also werden alle addiert.

Die Erklärungen zu a1 und a2 auf der offiziellen Website lauten wie folgt:

  • Wenn ORDER BY mit fehlender WINDOW-Klausel angegeben wird, wird standardmäßig die WINDOW-Spezifikation verwendet RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
  • Wenn sowohl die ORDER BY- als auch die WINDOW-Klausel fehlen, wird standardmäßig die WINDOW-Spezifikation verwendet ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Daher sind a1 und a2 äquivalent zu

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a2,
from datadev.t_student;

 Die offizielle Website-Adresse lautet wie folgt:

LanguageManual WindowingAndAnalytics – Apache Hive – Apache Software Foundation

3. Testen Sie  den Bereich zwischen ... und ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as b1,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) as b2
from datadev.t_student;

Die Testergebnisse sind wie folgt:

 analysieren:

  1. sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING): BEREICH ZWISCHEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 是默认值,可不写。
  2. sum(score) over (PARTITION nach ID, Reihenfolge nach Punktzahl ZWISCHEN 1 VORHERIGEN UND UNBEGRENZTEN FOLGENDEN): Gruppieren Sie nach ID, sortieren Sie in aufsteigender Reihenfolge der Punktzahl und reduzieren Sie die untere Grenze der Punktzahl der aktuellen Zeile um eins, und die obere Grenze ist alles (was als unendlich angesehen werden kann) als Filterbereich. Fügen Sie abschließend die Ergebnisse hinzu, die dem Screening-Bereich entsprechen.

Die Analyse des Betriebsprozesses von b2 lautet wie folgt:

Ausweis Punktzahl Betriebsablauf Betrieb b2
stu_1 1 [Score-Wert der aktuellen Zeile - 1, ∞] ==> dh [0, ∞] 1+2+3+4+5+5=20 20
stu_1 2 [Score-Wert der aktuellen Zeile - 1, ∞] ==> das ist [1, ∞] 1+2+3+4+5+5=20 20
stu_1 3 [Score-Wert der aktuellen Zeile - 1, ∞] ==> das ist [2, ∞] 2+3+4+5+5=19 19
stu_1 4 [Score-Wert der aktuellen Zeile - 1, ∞] ==> das ist [3, ∞] 3+4+5+5=17 17
stu_1 5 [Score-Wert der aktuellen Zeile - 1, ∞] ==> das ist [4, ∞] 4+5+5=14 14
stu_1 5 [Score-Wert der aktuellen Zeile - 1, ∞] ==> das ist [4, ∞] 4+5+5=14 14

4. Vergleichen Sie  den Bereich zwischen ... und ... und die Zeilen zwischen ... und ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) as a,
sum(score) over (PARTITION by id order by score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as b
from datadev.t_student;

Die Testergebnisse sind wie folgt:

 analysieren:

Ausweis Punktzahl Reichweitenbetriebsprozess Reichweitenbetrieb a(Bereich) Zeilenoperationsprozess Zeilenoperation b(Zeilen)
stu_1 1 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [0, 2] 1+2=3 3
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
1+2=3 3
stu_1 2 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [1, 3] 1+2+3=6 6
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
1+2+3=6 6
stu_1 3 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [2, 4] 2+3+4=9 9
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
2+3+4=9 9
stu_1 4 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [3, 5] 3+4+5+5=17 17
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
3+4+5=12 12
stu_1 5 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [4, 6] 4+5+5=14 14
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
4+5+5=14 14
stu_1 5 [Score-Wert der aktuellen Zeile - 1, Score-Wert der aktuellen Zeile + 1] ==> dh [4, 6] 4+5+5=14 14
Addieren Sie die Punktzahl der vorherigen Zeile und der nächsten Zeile der aktuellen Zeile
5+5=10 10

Referenzdokumentation: Hive-Fenster und Analysefunktionen

Supongo que te gusta

Origin blog.csdn.net/qq_37771475/article/details/121774383
Recomendado
Clasificación