Window関数1

行同士の比較やサマリが必要な場合や、

単独列でサマリ値などが必要な場合に使おう。

qiita.com

 

■以下のテーブルに、色んなWindow関数を当ててみる

f:id:akCs:20210329200852p:plain

■各行にScoreの合計を単純にセット

SELECT
No,student_id, subject, score,
sum(score) over()
FROM TestScore

f:id:akCs:20210329201016p:plain

overで指定された範囲をSumするの意。

上記の様に範囲未指定の場合、データ全量が対象になる。

 

■各行に先頭から現在行までのScoreの合計をセット

SELECT
No,student_id, subject, score,
sum(score) over(order by No)
FROM TestScore

f:id:akCs:20210329201451p:plain

orderだけを指定した場合、全量に対してOrderで並び変え、

先頭から現在行まで足した値をセットする。

(*)もう一つ同じような例

SELECT
No,student_id, subject, score,
sum(score) over(order by student_id)
FROM TestScore

f:id:akCs:20210329201619p:plain

■特定項目ごとの合計を各行にセット

SELECT
No,student_id, subject, score,
sum(score) over(partition by student_id
FROM TestScore

f:id:akCs:20210329201938p:plain

Partitionで指定された範囲毎に指定項目の合計を出すの意

Partition内の項目は勿論複数指定可能。

 

■条件に応じた順序を振った列を作る

SELECT
No,student_id, subject, score,
RANK() over(partition by subject order by score desc) as rank
FROM TestScore

f:id:akCs:20210329202404p:plain

subject毎にscoreでソートして順序を振るの意

上記例だと、同じ点数はRankが同じとなっている。

例えば、更にstudent_idが若い方を上とするなら、

以下の様にorder by句を追加する。

SELECT
No,student_id, subject, score,
RANK() over(partition by subject order by score desc,student_id) as rank
FROM TestScore

f:id:akCs:20210329202958p:plain

上記は教科毎の順位を出している例だが、

例えば各生徒毎に点数がいい順に教科を並べるなら以下のようになる。

SELECT
No,student_id, subject, score,
RANK() over(partition by student_id order by score desc) as rank
FROM TestScore

f:id:akCs:20210329203432p:plain