ROWS & RANGEの基準
CoddyのSQLジャーニー「基礎」セクションの一部。レッスン 69/72。
現時点では、考慮する前後の行数の選択について柔軟に対応することはできません。現在は、ROWS & RANGEの基準を使えば可能です。これらを使うには、次のように記述します。
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
次のオプションを指定できます:
CURRENT ROW- 現在の行n PRECEDING- 現在の行より前の行n FOLLOWING- 現在の行より後の行
ROWS と RANGE の違いは、ROWS の基準が値を考慮せず、位置だけを考慮するのに対し、RANGE は行の位置ではなく値の範囲に基づいてウィンドウを定義することです。
RANGE では、ORDER BY --column_name-- を必ず指定する必要があります。そうしないと、ウィンドウの選択方法が分からないためです。
例:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGここでは、current row、その before の row、およびその after の row を含むウィンドウを作成します。
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levelsここでは、昇順に並べ替えられた各levelsについて、current level、1つのlevels before、1つのlevels afterを含むウィンドウを作成します。current levelが5の場合、levels 4、5、6が含まれます。
注: RANGE BETWEEN を使用すると、ウィンドウに含まれる行が増える可能性があります。これは、範囲内の行と同じ values を共有するすべての行が含まれるためです。一方、ROWS BETWEEN は、データセット内に存在する限り、常に同じ数の行を含みます。
また、RANGE は date 列をサポートしていません。
ROWS と RANGE の違いを説明する簡単な例を示します:
ROWS を使用する場合:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsRANGE の使用:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_rangeチャレンジ
簡単利用可能なテーブルと列:
newspapers:date、num_newspapers
この課題では、production の newspapers データがあります。現在の行の2日前から1日後までに印刷された新聞の平均を知りたいとします。また、現在の日付とその3日前までに印刷された新聞の最大数と最小数の差も知りたいとします。これらの列をそれぞれ avg_newspapers と diff_newspapers と呼びます。
自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド