フレーム句:ROWSとRANGE
ROWS BETWEENとRANGE BETWEENのフレーム句を使い分け、それぞれが重複や欠損をどう扱うかを理解します。
「フレーム句:ROWSとRANGE」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
OVERの内側にあるフレーム
ウィンドウ関数はフレーム、つまりパーティション内の行の一部を対象に評価します。フレームは次の要素で定義されます。
OVER (
PARTITION BY ...
ORDER BY ...
ROWS BETWEEN <start> AND <end> -- or RANGE BETWEEN ...
)デフォルトフレーム
ORDER BYを指定してフレームを指定しない場合、デフォルトは次のとおりです。
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
-- "From the first row up to all rows tied with the current row".ROWSは物理的に数える
ROWSは、値に関係なく、パーティションの順序に従ってN行を数えます。
SUM(x) OVER (ORDER BY day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
-- The current row plus the previous 2. Exactly 3 rows.RANGEは値で数える
RANGEは、ORDER BYの値が現在の値を基準とした範囲内にある行を数えます。
SUM(x) OVER (
ORDER BY day
RANGE BETWEEN INTERVAL '2 days' PRECEDING AND CURRENT ROW
)
-- All rows within 2 days (by calendar) of the current row.この違いが重要な理由
データに欠損がある場合、ROWSとRANGEでは異なる結果になります。
-- Days: 1, 3, 5 (no 2 or 4)
-- ROWS BETWEEN 2 PRECEDING AND CURRENT ROW for day 5: rows 1,3,5 = 3 days
-- RANGE BETWEEN INTERVAL '2 days' PRECEDING for day 5: only days 3,5 = 2 daysGROUPSフレーム(PG 11以降)
GROUPSは個々の行ではなく、ORDER BYで同値となるピアグループを数えます。
SUM(x) OVER (
ORDER BY tier
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
)
-- "The current tier and the previous tier" — useful when ORDER BY has many ties.フレーム境界
UNBOUNDED PRECEDING— パーティションの最初の行n PRECEDINGCURRENT ROWn FOLLOWINGUNBOUNDED FOLLOWING— 最後の行
累積合計
開始位置から現在の行までを合計します。
SUM(x) OVER (ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-- Same as the default frame.後方移動ウィンドウ
N日間の移動平均です。
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS avg_7d中央寄せウィンドウ
前後の両方を参照します。
AVG(revenue) OVER (
ORDER BY day
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centred_7dLAST_VALUEの注意点
デフォルトフレームでLAST_VALUEを使うと、パーティションの最後ではなく現在の行が返されます。明示的にunboundedフレームを指定してください。
LAST_VALUE(name) OVER (
PARTITION BY group ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)EXCLUDE句(PG 11以降)
フレーム内の特定の行を除外します。
SUM(x) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
EXCLUDE CURRENT ROW
)
-- All previous 6 days but not today.まとめ
フレーム句を使うと、ウィンドウを正確に制御できます。
- ROWS — 物理的な行数
- RANGE — 値に基づく間隔
- GROUPS — ピアグループ
- デフォルトフレームは意外な結果になることがあるため、明示的に指定する
クイックチェック
日別の売上データに欠損日があります。「現在から過去7暦日以内のすべての行」を取得するには、どのフレームを使いますか?
よくある質問
「フレーム句:ROWSとRANGE」レッスンは無料ですか?
はい。「フレーム句:ROWSとRANGE」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「フレーム句:ROWSとRANGE」で何を学びますか?
ROWS BETWEENとRANGE BETWEENのフレーム句を使い分け、それぞれが重複や欠損をどう扱うかを理解します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「フレーム句:ROWSとRANGE」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- フレーム句:ROWSとRANGE
- フレームウィンドウでのLag/Lead
- NTILEとCume_Distによるバケット分割
- 実務で使うレポートパターン