クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

SQLの窓関数で累計と順位を出す

このレッスンのあとで: 行を減らさずに、累計や順位を各行の横に付けられる。

50分のレッスンコマンドなし

行を減らさずに、累計や順位を付ける

窓関数とは、行を減らさずに、累計や順位を各行の横に付ける SQL の機能です。

売上の累計を出したいとき、GROUP BY を使うと、行が1つにまとまってしまいます。窓関数なら、元の行がすべて残ります。

1週間の売上表で試しましょう。

このレッスンのゴール

メモ

行を減らさずに、累計や順位を各行の横に付けられる。

重要な言葉

ことばいみれい
窓関数各行の周りの行を見て、行ごとに値を出す関数
OVER 句窓関数に、どの行を見るかを教える句over (order by sale_date)
累計先頭からその行までを足し合わせた値
順位値の大きさの順に付ける番号rank()
同順位同じ値の行に、同じ順位が付くこと
lag1つ前の行の値を取り出す窓関数

学生が入力するセルは、このプレビューでは空白です。

GROUP BY は行をまとめ、窓関数は行を残す

group by は、同じ種類の行を1つにまとめます。行の数は減ります。

窓関数は、集計の結果を、元の行のそれぞれに付けます。行の数は変わりません。

書き方は、関数のあとに over (...) を付けるだけです。

例: 売上と累計

日付売上累計
4月1日4200042000
4月2日3850080500
4月3日51000131500
4月4日51000182500

学生が入力するセルは、このプレビューでは空白です。

試す: 売上の累計

コード: duckdb
-- 日ごとの売上に、その日までの累計を付けます。
select sale_date, amount,
       sum(amount) over (order by sale_date) as running_total
from daily_sales
order by sale_date;
-- over の中の order by を消して、累計がどう変わるか見ましょう。

OVER の中の ORDER BY が、累計の向きを決める

over (order by sale_date) は、日付の順に並べて、先頭からその行までを足す、という意味です。

order by がないと、窓は表の全部の行になります。どの行にも、同じ合計が付きます。

順位は、同点をどう扱うかで2通りある

rank() は、同点に同じ順位を付けて、次の順位を飛ばします。1位、2位、3位、3位、5位となります。

dense_rank() は、同点でも順位を飛ばしません。1位、2位、3位、3位、4位です。

試す: rank と dense_rank

コード: duckdb
-- 売上の多い順に、2通りの順位を付けます。
select sale_date, amount,
       rank() over (order by amount desc) as rnk,
       dense_rank() over (order by amount desc) as drnk
from daily_sales
order by amount desc, sale_date;

例: 2つの順位の違い

売上rankdense_rank
6300011
5500022
51000 (2日)33
4750054

学生が入力するセルは、このプレビューでは空白です。

試す: 前の日との差

コード: duckdb
-- 前の日の売上と、その差を並べます。
select sale_date, amount,
       lag(amount) over (order by sale_date) as prev_amount,
       amount - lag(amount) over (order by sale_date) as diff
from daily_sales
order by sale_date;

よくある間違い

注意

累計を出したいのに、over () と書いてしまうことがあります。順番がないので、どの行にも全体の合計が付きます。order by を忘れないでください。

さらに挑戦

各日の売上が、1週間の合計の何%かを出すには、どう書きますか。ヒントは、sum(amount) over () を分母にすることです。

次に、同じ 51000 円の2日が、rank では同じ順位になる理由を、自分の言葉で説明してください。

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。