📣新登場!TiDB Cloud BYOC、TiDB Cloud Filesystem、PostgreSQL-compatible TiDB Cloud Starter がパブリックプレビュー中。このページは自動翻訳されたものです。原文はこちらからご覧ください。

ウィンドウ関数



概要

ウィンドウ関数は、関連する行の集合に対して計算を実行しながら、入力行ごとに 1 つの結果を返します。集計関数とは異なり、ウィンドウ関数は行を 1 つの出力にまとめません。

主な特徴:

  • 現在の行に関連する行の「ウィンドウ」に対して動作します
  • 入力行ごとに 1 つの値を返します(グループ化や集約による行の圧縮は行いません)
  • ウィンドウ内の他の行の値にアクセスできます
  • 柔軟な計算のためにパーティション分割と並び替えをサポートします

このドキュメントの SQL 例について:

  • ✅ 完全な SQL 文は TiDB Cloud Lake に対して検証済みです
  • ⚠️ 構文例はウィンドウフレームのパターンを示します(完全な文ではありません)
  • 📋 すべての例は TiDB Cloud Lake がサポートする標準 SQL 構文を使用しています
  • 🔍 「完全な例」と記載された例はそのまま実行可能です

ウィンドウ関数のカテゴリ

TiDB Cloud Lake は、ウィンドウ関数の 2 つの主要カテゴリをサポートしています。

1. ウィンドウ専用関数

これらの関数は、ウィンドウ操作向けに特別に設計されています。

ランキング関数:

関数説明同順位の扱い出力例
ROW_NUMBER連番を付与常に一意1, 2, 3, 4, 5
RANKギャップありの順位付け同順位は同じ順位、その後にギャップ1, 2, 2, 4, 5
DENSE_RANKギャップなしの順位付け同順位は同じ順位、ギャップなし1, 2, 2, 3, 4

分布関数:

関数説明範囲出力例
PERCENT_RANKパーセンテージとしての相対順位0.0 から 1.00.0, 0.25, 0.5, 0.75, 1.0
CUME_DIST累積分布0.0 から 1.00.2, 0.4, 0.6, 0.8, 1.0
NTILEN 個のバケットに分割1 から N1, 1, 2, 2, 3, 3

値アクセス関数:

関数説明ユースケース
FIRST_VALUEウィンドウ内の最初の値最大値 / 最も早い値を取得
LAST_VALUEウィンドウ内の最後の値最小値 / 最新の値を取得
NTH_VALUEウィンドウ内の N 番目の値特定位置の値を取得
LAG前の行の値前の値と比較
LEAD次の行の値次の値と比較

エイリアス:

関数エイリアス元
FIRSTFIRST_VALUE
LASTLAST_VALUE

2. ウィンドウ関数として使用される集計関数

これらは標準の集計関数で、OVER 句とともに使用することでウィンドウ操作を実行できます。

関数説明ウィンドウフレームのサポート例
SUMウィンドウ全体の合計を計算✓SUM(sales) OVER (PARTITION BY region ORDER BY date)
AVGウィンドウ全体の平均を計算✓AVG(score) OVER (ORDER BY id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
COUNTウィンドウ内の行数をカウント✓COUNT(*) OVER (PARTITION BY department)
MINウィンドウ内の最小値を返す✓MIN(price) OVER (PARTITION BY category)
MAXウィンドウ内の最大値を返す✓MAX(price) OVER (PARTITION BY category)
ARRAY_AGG値を配列に収集ARRAY_AGG(product) OVER (PARTITION BY category)
STDDEV_POP母標準偏差✓STDDEV_POP(value) OVER (PARTITION BY group)
STDDEV_SAMP標本標準偏差✓STDDEV_SAMP(value) OVER (PARTITION BY group)
MEDIAN中央値✓MEDIAN(response_time) OVER (PARTITION BY server)

条件付きバリアント

関数説明ウィンドウフレームのサポート例
COUNT_IF条件付きカウント✓COUNT_IF(status = 'complete') OVER (PARTITION BY dept)
SUM_IF条件付き合計✓SUM_IF(amount, status = 'paid') OVER (PARTITION BY customer)
AVG_IF条件付き平均✓AVG_IF(score, passed = true) OVER (PARTITION BY class)
MIN_IF条件付き最小値✓MIN_IF(temp, location = 'outside') OVER (PARTITION BY day)
MAX_IF条件付き最大値✓MAX_IF(speed, vehicle = 'car') OVER (PARTITION BY test)

基本構文

すべてのウィンドウ関数は、次のパターンに従います。

FUNCTION() OVER ( [ PARTITION BY column ] [ ORDER BY column ] [ window_frame ] )
  • PARTITION BY: データをグループに分割します
  • ORDER BY: 各パーティション内で行を並び替えます
  • window_frame: 含める行を定義します(省略可能)

ウィンドウフレームの指定

ウィンドウフレームは、各行の計算に含まれる行を定義します。TiDB Cloud Lake は 2 種類のウィンドウフレームをサポートしています。

1. ROWS BETWEEN

物理的な行数を使用してウィンドウフレームを定義します。

構文:

ROWS BETWEEN frame_start AND frame_end

例:

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 累積合計
  • ROWS BETWEEN 2 PRECEDING AND CURRENT ROW - 3 日移動平均
  • ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - 中心ウィンドウ

詳細な例と使用方法については、ROWS BETWEEN を参照してください。

2. RANGE BETWEEN

論理的な値の範囲を使用してウィンドウフレームを定義します。

構文:

RANGE BETWEEN frame_start AND frame_end

例:

  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 値に基づく累積
  • RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW - 7 日間ウィンドウ

詳細な例と使用方法については、RANGE BETWEEN を参照してください。

一般的なユースケース

  • ランキング: リーダーボードや上位 N 件のリストを作成
  • 分析: 累積合計、移動平均、パーセンタイルを計算
  • 比較: 現在の値と前 / 次の値を比較
  • グループ化: 詳細を失わずにデータをバケットに分割

詳細な構文と例については、上記の各関数のドキュメントを参照してください。

このページは役に立ちましたか?