ウィンドウ関数の知識:
1. <window function>の位置には、次の2つの関数を含めることができます
。1)専用のウィンドウ関数(rank、dense_rank、row_number、および後述するその他の専用ウィンドウ関数など)。
2)sum。avg、count、max、minなどの集計関数
2.使用法
ウィンドウ関数はwhereまたはgroup by句の結果を操作するため、原則として、ウィンドウ関数はselect句でのみ記述できます。
簡単に言うと、ウィンドウ関数には次の関数があります
。1)グループ化と並べ替えを同時に行う機能があります
。2)元のテーブルの行数を減らしません
。3)構文は次のとおりです。
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
第3に、
ウィンドウ関数の特別な機能ウィンドウ関数には、前に学習した句ごとのグループ化によるグループ化と句ごとの並べ替え関数の機能があります。では、なぜウィンドウ関数を使用するのでしょうか?
これは、グループ化によってグループ化と要約の後にテーブルの行数が変更され、行に1つのカテゴリしかないためです。partition byおよびrank関数は、元のテーブルの行数を減らしません。たとえば、次の例では、各クラスの人数をカウントしています。
つまり、ウィンドウ関数には次の関数があります。
1)パーティション
ごとの機能と関数による順序の両方がある2)元のテーブルの行数は減らないため、各グループ内でのランク付けによく使用されます
4.特別なウィンドウ関数の例:
クラス「1」を例にとると、このクラスのグレード「95」が最初にランク付けされ、クラス「83」が4番目にランク付けされます。上記の結果は、実際に各クラスの要件に従ってランク付けされています。
select *,
rank() over (partition by 班级
order by 成绩 desc) as ranking
from 班级表
このSQL文のselect句について説明しましょう。ランクはソート関数です。要件は「各クラス内のグレードでランク付けする」で、この文は2つの部分に分けることができます。
1)各クラス内:クラスごとの
パーティションを使用して、テーブルをグループ化します。この例では、「クラス」のグループ化(クラスごとのパーティション)を指定します
。2)グレードによるランク付け
order by句の機能は、グループ化された結果をソートすることです。デフォルトでは、結果を昇順(asc)でソートします。この例では、(成績による並べ替えdesc)は、成績の列で並べ替えられ、降順を示すためにdescキーワードが追加されています。
次の図から、(グループ化)によるパーティションと(グループ内でのソート)による順序付けの役割を理解できます。
パーティション句が省略され、省略されている場合は、グループ化が指定されていないことを意味します。結果は次のとおりですが、結果は高から低に並べ替えられます。
select *,
rank() over (order by 成绩 desc) as ranking,
dense_rank() over (order by 成绩 desc) as dese_rank,
row_number() over (order by 成绩 desc) as row_num
from 班级表
5.
ウィンドウ関数としての集計関数。集計関数とウィンドウ関数の使用法は、上記の専用ウィンドウ関数とまったく同じです。集計関数はウィンドウ関数の位置にのみ記述する必要がありますが、関数の後の括弧は空にできません。集計を指定する必要があります。列名。
select *,
sum(成绩) over (order by 学号) as current_sum,
avg(成绩) over (order by 学号) as current_avg,
count(成绩) over (order by 学号) as current_count,
max(成绩) over (order by 学号) as current_max,
min(成绩) over (order by 学号) as current_min
from 班级表
ウィンドウ関数としての集計関数。各行のデータ、この行のデータ、統計データ(最大、最小など)を直感的に確認できます。同時に、全体的な統計に対するデータの各行の影響を確認できます。
6.ウィンドウ関数の使用シナリオ
1)「各グループでのランキング」などのビジネス要件:
ランキングの問題:各部門がパフォーマンスの
問題によってtopN をランク付け:各部門の上位Nの従業員を報酬として見つけます