0Pricing
SQL Academy · レッスン

フレーム句: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 days

GROUPSフレーム(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 PRECEDING
  • CURRENT ROW
  • n FOLLOWING
  • UNBOUNDED 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_7d

LAST_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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. フレーム句:ROWSとRANGE
  2. フレームウィンドウでのLag/Lead
  3. NTILEとCume_Distによるバケット分割
  4. 実務で使うレポートパターン
← SQL Academyに戻る