1.ウィンドウ関数の用途は何ですか?
日常業務では、次のビジネス要件など、各グループでランク付けする必要が生じることがよくあります。
ランク付けの問題:各部門はパフォーマンスの
問題に従ってtopNをランク付けします:報酬のために各部門の上位N人の従業員を見つけます
このようなニーズに直面した場合、SQLの高度なウィンドウ関数を使用する必要があります。
2.ウィンドウ関数とは何ですか?
OLAP関数(オンライン分析処理、オンライン分析処理)とも呼ばれるウィンドウ関数は、データベースデータのリアルタイム分析と処理を実行できます。
ウィンドウ関数の基本的な構文は次のとおりです。
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
では、構文の<ウィンドウ関数>とは何ですか?
<ウィンドウ関数>の位置は、次の2つの関数を配置できます。
1)ランク、dense_rank、row_number、および後述するその他の専用ウィンドウ関数を含む専用ウィンドウ関数。
2)sum。avg、count、max、minなどの集計関数。
ウィンドウ関数は、where句またはgroup by句が処理された結果に基づいて動作するため、ウィンドウ関数は、原則としてselect句でのみ記述できます。
3.使い方は?
次に、いくつかのウィンドウ関数の使用法を例と組み合わせて紹介します。
1.専用ウィンドウ関数ランク
たとえば、次の図はクラステーブルの内容です
各クラスの成績でランク付けしたい場合、次の結果が得られます。
クラス「1」を例にとると、このクラスのグレード「95」が1位、このクラスのグレード「83」が4位です。上記の結果は、実際に各クラスの要件に従ってランク付けされています。
上記の結果を取得するためのSQLステートメントコードは次のとおりです。
select *,
rank() over (partition by 班级
order by 成绩 desc) as ranking
from 班级表
このSQLステートメントのselect句について説明しましょう。ランクはソートの関数です。要件は「各クラス内のグレードによるランク付け」です。この文は2つの部分に分けることができます。
1)各クラス内:クラスごとのグループ
パーティションバイは、テーブルをグループ化するために使用されます。この例では、「クラス」グループを指定します(クラスごとのパーティション)
2)グレードごとにランク付け
order by句の機能は、グループ化された結果を並べ替えることであり、デフォルトでは、結果を昇順(asc)で並べ替えます。この例(成績の説明による順序)では、成績の列で並べ替えられ、descキーワードが追加されて降順を示します。
次の図から、partition by(グループ化)とorder by(グループ内での並べ替え)の役割を理解できます。
ウィンドウ関数には、これまでに学習したgroupby句のグループ化機能とorderby句の並べ替え機能があります。では、なぜウィンドウ関数を使用するのでしょうか。
これは、group byは、グループ化して要約した後にテーブルの行数を変更し、1行にカテゴリが1つしかないためです。パーティション分割およびランク付け関数は、元のテーブルの行数を減らしません。たとえば、以下は各クラスの人数をカウントします。
相信通过这个例子,你已经明白了这个窗口函数的使用:
select *,
rank() over (partition by 班级
order by 成绩 desc) as ranking
from 班级表
さて、戻ってきましたが、なぜ「ウィンドウ」関数と呼ばれるのですか?これは、グループ化による分割の結果を「窓」と呼んでいるためです。ここの窓は、我が家のドアや窓ではなく、「スコープ」を意味します。
簡単に言えば、ウィンドウ関数には次の関数があります。
1)グループ化と並べ替えの両方の機能があります
2)元のテーブルの行数を減らさないでください
3)構文は次のとおりです。
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
2.その他のプロのウィンドウ関数
専用ウィンドウ関数rank、dense_rank、row_numberの違いは何ですか?
それらの違いの例を挙げましょう。一目で理解できます。
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桁、5桁、5桁、8桁です。つまり、並列ランクの行がある場合、次の位置を占めます。1、2、3、4、今トップ3が一緒に接続され、例えば、通常のランキングは、結果はである:1、1、1、4。
Dense_rank関数:この例では、5桁、5桁、5桁、6桁です。つまり、並列ランクの行がある場合、次のランクの位置を占めません。1、2、3、4、今トップ3が一緒に接続され、例えば、通常のランキングは、結果はである:1、1、1、2。
Row_number関数:この例では、5桁、6桁、7桁、8桁です。つまり、並列ランキングの場合は考慮されていません。例えば、上位3ランクが結ばれ、ランキングが正常である1、2、3、4。
これら3つの機能の違いは次のとおりです。
最後に、強調する必要がある1つのポイントは、上記の3つの専用ウィンドウ関数では、関数の後の括弧はパラメーターを必要とせず、()を空のままにすることです。
さて、ウィンドウ関数の基本を理解しましたか?
3.ウィンドウ関数としての集計関数
集計およびウィンドウ関数の使用法は、上記の専用ウィンドウ関数とまったく同じです。ウィンドウ関数の位置に集計関数を記述するだけで済みますが、関数の後の括弧と列名を空にすることはできません。集計のを指定する必要があります。
ウィンドウ関数が集計関数の場合にどのような結果が得られるかを見てみましょう。
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 班级表
答えを得た:
何か見つかりましたか?例として合計のみを使用します。
上図に示すように、ウィンドウ関数の集計関数の合計は、自己レコードと自己レコードの上のデータを合計した結果です。たとえば、No。0004の場合、合計ウィンドウ関数を使用した後の結果は、No。0001、0002、0003、0004の結果の合計になります。No.0005の場合、結果はNo.の結果の合計になります。 .0001〜0005など。
合計、平均、カウント、最大値、最小値だけでなく、同じ値もすべて自分のレコードと自分のレコードのすべてのデータに対して計算されます。今(以下)で得られた結果を組み合わせて、理解できますか?より簡単に?
たとえば、No。0005の背後にある集計ウィンドウ関数の結果は、学生番号0001〜0005の5人の学生のスコアの合計、平均、カウント、および最大値と最小値です。
合計や平均など、全員のスコアの集計結果を知りたい場合は、最後の行を見てください。
このようなウィンドウ関数を使用する用途は何ですか?
集計関数をウィンドウ関数として使用すると、各行のデータで、この行のデータの時点で、統計データ(最大値、最小値など)を直感的に確認できます。同時に、データの各行が全体的な統計データに与える影響を確認できます。
4.注意が必要な事項
パーティション句は省略されています。省略されている場合、グループ化は指定されていません。結果は次のとおりですが、結果は高から低にソートされます。
select *,
rank() over (order by 成绩 desc) as ranking
from 班级表
答えを得た:
ただし、これによりウィンドウ関数の機能が失われるため、通常はこのように使用しないでください。
4.まとめ
1.ウィンドウ関数の構文
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
<ウィンドウ関数>の位置は、次の2つの関数を配置できます。
1)rank、dense_rank、row_numberなどの専用ウィンドウ関数。
2)sum。avg、count、max、minなどの集計関数。
2.ウィンドウ関数には次の関数があります。
1)パーティション分割とorderbyの機能を同時に備えています。
2)元のテーブルの行数が減らないため、各グループ内でランク付けするためによく使用されます
3.注意が必要な事項
原則として、ウィンドウ関数はselect句でのみ記述できます。
4.ウィンドウ関数の使用シナリオ
1)次のようなビジネス要件「各グループのランク」:
ランク付けの問題:各部門はパフォーマンスの
問題に従ってtopNをランク付けします:報酬のために各部門の上位N人の従業員を見つけます