HIVE SQL集計関数と行間/範囲間の詳細説明

1. 間の行と範囲の使用

1. 関連キーワードの分析

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. ... と ... の間の行

rows: 行番号によって決定されるフレームの範囲を指します。これは物理的な意味での行です。

たとえば、前の 1 行と次の 1 行の間の行は、現在の行の 1 行前と 1 行後の行を表します。

3. ... と ... の間の範囲

range: ウィンドウ関数の現在の行の値をベースとして参照し、order by に従って並べ替え、最後に範囲に従って上限と下限を加算および減算します。は論理行です。

たとえば、 sum(score) over (PARTITION by id order by core BETWEEN 1 PRECEDING AND 1 FOLLOWING) は、ID でグループ化し、スコアで昇順に並べ替えてから、現在の行のスコアを範囲として取り、下限から 1 を減算し、上限に 1 を加えて、この範囲内のスコアを合計することを意味します。

少しくどいので、理解するために例を見てみましょう。

2、例

1. データの準備

datadev.t_student というテーブルがあるとします。データは次のとおりです。

ID スコア
stu_1 1
stu_1 2
stu_1 3
stu_1 4
stu_1 5
stu_1 5

2.  ... と ... の間の行をテストします。

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;

テスト結果は次のとおりです。

分析します:

  1. sum(score) over (PARTITION by id) as a1: IDごとにグループ化し、スコアを直接合計します。これは誰にとっても最も馴染みのあるものです。
  2. sum(score) over (PARTITION by id order by core) as a2: スコア順にソートし、開始行から現在の行までを合計 a3 の ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW との違いは、スコアが同じ場合は同じ順位をカウントして加算することです。ランクの概念と似ています。
  3. sum(score) over (PARTITION by id order by core ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW):開始行から現在の行までの合計です。a2 とは異なり、スコアが同じ場合、ランキングは異なるため、現在の行まで合計されません。row_number の概念と似ています。
  4. sum(score) over (PARTITION by id order by core ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING):開始行から終了行までの合計 (a1 と同じ)。
  5. sum(score) over (PARTITION by id order by 1):この関数は a2 と同じで、order by 1 は同じスコアに相当するため、すべてが合計されます。

公式サイトでのa1とa2の説明は以下の通りです。

  • WINDOW 句が欠落している状態で ORDER BY が指定された場合、WINDOW 指定はデフォルトで次のようになります。 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
  • ORDER BY 句と WINDOW 句の両方が欠落している場合、WINDOW 指定はデフォルトで次のようになります。 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

したがって、a1 と a2 は次と同等です。

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;

 公式サイトのアドレスは以下の通りです。

言語マニュアル WindowingAndAnalytics - Apache Hive - Apache Software Foundation

3.  ... と ... の間の範囲をテストします。

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;

テスト結果は次のとおりです。

 分析します:

  1. sum(score) over (PARTITION by id order by core RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING): RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING は許可値であり、書き込みできません。
  2. sum(score) over (PARTITION by id order by core BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING): ID でグループ化し、スコアの昇順にソートし、現在の行のスコアの下限を 1 つ減らし、上限はすべて (無限大とみなせる) をフィルタリング範囲として指定します。最後に、スクリーニング範囲を満たすスコアを加算します。

b2 の動作プロセスの分析は次のとおりです。

ID スコア 操作プロセス 手術 b2
stu_1 1 [現在の行のスコア値 - 1, ∞] ==> つまり [0, ∞] 1+2+3+4+5+5=20 20
stu_1 2 [現在の行のスコア値 - 1, ∞] ==> つまり [1, ∞] 1+2+3+4+5+5=20 20
stu_1 3 [現在の行のスコア値 - 1, ∞] ==> つまり [2, ∞] 2+3+4+5+5=19 19
stu_1 4 [現在の行のスコア値 - 1, ∞] ==> つまり [3, ∞] 3+4+5+5=17 17
stu_1 5 [現在の行のスコア値 - 1, ∞] ==> つまり [4, ∞] 4+5+5=14 14
stu_1 5 [現在の行のスコア値 - 1, ∞] ==> つまり [4, ∞] 4+5+5=14 14

4.  ... と ... の間の範囲と ... と ... の間の行を比較します。

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;

テスト結果は次のとおりです。

 分析します:

ID スコア 範囲演算処理 レンジ操作 a(範囲) 行操作プロセス 行操作 b(行)
stu_1 1 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [0, 2] 1+2=3 3 現在の行の前の行と次の行
のスコアを加算します
1+2=3 3
stu_1 2 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [1, 3] 1+2+3=6 6 現在の行の前の行と次の行
のスコアを加算します
1+2+3=6 6
stu_1 3 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [2, 4] 2+3+4=9 9 現在の行の前の行と次の行
のスコアを加算します
2+3+4=9 9
stu_1 4 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [3, 5] 3+4+5+5=17 17 現在の行の前の行と次の行
のスコアを加算します
3+4+5=12 12
stu_1 5 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [4, 6] 4+5+5=14 14 現在の行の前の行と次の行
のスコアを加算します
4+5+5=14 14
stu_1 5 [現在の行のスコア値 - 1, 現在の行のスコア値 + 1] ==> ie [4, 6] 4+5+5=14 14 現在の行の前の行と次の行
のスコアを加算します
5+5=10 10

参考ドキュメント: Hive ウィンドウと分析関数

おすすめ

転載: blog.csdn.net/qq_37771475/article/details/121774383