ウィンドウ関数(23関数)
全行スキャン型のウィンドウ関数。各行に対して1つの値を返す。GROUP BY は使用せず、ウィンドウフレーム内で計算を行う。
← 関数リファレンス に戻る
ローリング統計量
注意: 本カテゴリの関数はすべてウィンドウ関数(全行スキャン型)として実装されている。各行に対して1つの値を返す。
GROUP BYは使用しない。
stat_rolling_mean
ローリング平均(移動平均)を計算する。指定したウィンドウサイズの直近 n 件の平均値を各行に返す。
構文: stat_rolling_mean(column, window_size)
| パラメータ | 説明 |
|---|---|
window_size |
ウィンドウサイズ(整数) |
ウィンドウ未満の先頭行は
NULLを返す。
-- 3日間のローリング平均
SELECT date, price,
stat_rolling_mean(price, 3) AS rolling_avg
FROM stock_prices;
-- 7日間移動平均で平滑化
SELECT timestamp, value,
stat_rolling_mean(value, 7) AS smoothed
FROM sensor_data;
stat_rolling_std
ローリング標準偏差を計算する。
構文: stat_rolling_std(column, window_size)
SELECT date, price,
stat_rolling_std(price, 5) AS rolling_volatility
FROM stock_prices;
stat_rolling_min
ローリング最小値を計算する。
構文: stat_rolling_min(column, window_size)
SELECT date, price,
stat_rolling_min(price, 20) AS min_20d
FROM stock_prices;
stat_rolling_max
ローリング最大値を計算する。
構文: stat_rolling_max(column, window_size)
SELECT date, price,
stat_rolling_max(price, 20) AS max_20d
FROM stock_prices;
stat_rolling_sum
ローリング合計を計算する。
構文: stat_rolling_sum(column, window_size)
-- 7日間の累計売上
SELECT date, sales,
stat_rolling_sum(sales, 7) AS weekly_total
FROM daily_sales;
移動平均
stat_moving_avg
単純移動平均 (SMA) を計算する。stat_rolling_mean と同等。
構文: stat_moving_avg(column, window_size)
SELECT date, close_price,
stat_moving_avg(close_price, 20) AS sma_20
FROM stocks;
stat_ema
指数移動平均 (EMA) を計算する。最近のデータにより大きな重みを置く移動平均。
$$\text{EMA}t = \alpha \cdot x_t + (1-\alpha) \cdot \text{EMA}{t-1}, \quad \alpha = \frac{2}{\text{span}+1}$$
構文: stat_ema(column, span)
| パラメータ | 説明 |
|---|---|
span |
スパン(整数)。pandas の ewm(span=N) と同じ慣例 |
-- 12日間 EMA(α = 2/13 ≈ 0.154)
SELECT date, close_price,
stat_ema(close_price, 12) AS ema_12
FROM stocks;
-- SMA と EMA の比較
SELECT date, close_price,
stat_moving_avg(close_price, 20) AS sma_20,
stat_ema(close_price, 20) AS ema_20
FROM stocks;
ランク
stat_rank
順位変換を行う。各行の値に対してその順位を返す。同順位は平均順位。NULL 行は NULL を返す。
構文: stat_rank(column)
-- 成績の順位付け
SELECT name, score,
stat_rank(score) AS rank
FROM students;
欠損値補完
stat_fillna_mean
NULL 値を非 NULL 値の平均で補完する。
構文: stat_fillna_mean(column)
SELECT id, value,
stat_fillna_mean(value) AS filled
FROM measurements;
stat_fillna_median
NULL 値を非 NULL 値の中央値で補完する。
構文: stat_fillna_median(column)
SELECT id, value,
stat_fillna_median(value) AS filled
FROM measurements;
stat_fillna_ffill
NULL 値を直前の非 NULL 値で補完する(前方補完)。先頭が NULL の場合は NULL のまま。
構文: stat_fillna_ffill(column)
-- 時系列データの前方補完
SELECT timestamp, sensor_value,
stat_fillna_ffill(sensor_value) AS filled
FROM sensor_data;
stat_fillna_bfill
NULL 値を直後の非 NULL 値で補完する(後方補完)。末尾が NULL の場合は NULL のまま。
構文: stat_fillna_bfill(column)
SELECT timestamp, sensor_value,
stat_fillna_bfill(sensor_value) AS filled
FROM sensor_data;
stat_fillna_interp
NULL 値を線形補間で補完する。前後の非 NULL 値の間を線形に内挿する。
構文: stat_fillna_interp(column)
-- 時系列の欠損値を線形補間
SELECT timestamp, temperature,
stat_fillna_interp(temperature) AS interpolated
FROM hourly_data;
エンコーディング・ビニング
stat_label_encode
値をラベルエンコーディングする。ユニーク値をソートし、0 から順に整数を割り当てる。
構文: stat_label_encode(column)
-- カテゴリ値を数値化
SELECT id, color,
stat_label_encode(color) AS encoded
FROM products;
-- color=blue → 0, green → 1, red → 2(ソート順)
stat_bin_width
等幅ビニングを行う。値域を等幅の n 個のビンに分割し、各値が属するビン番号(0〜n-1)を返す。
構文: stat_bin_width(column, n_bins)
| パラメータ | 説明 |
|---|---|
n_bins |
ビン数(整数) |
-- 年齢を5つのビンに分類
SELECT name, age,
stat_bin_width(age, 5) AS age_group
FROM customers;
stat_bin_freq
等頻度ビニング(分位点ビニング)を行う。各ビンに同程度の件数が入るように n 個のビンに分割する。
構文: stat_bin_freq(column, n_bins)
| パラメータ | 説明 |
|---|---|
n_bins |
ビン数(整数) |
-- 4分位に基づくビニング
SELECT name, income,
stat_bin_freq(income, 4) AS income_quartile
FROM households;
時系列変換
stat_lag
ラグ(遅延)を適用する。k 行前の値を返す。先頭 k 行は NULL。
構文: stat_lag(column, k)
| パラメータ | 説明 |
|---|---|
k |
ラグ数(整数、正の値) |
-- 1期前の値を取得
SELECT date, price,
stat_lag(price, 1) AS prev_price,
price - stat_lag(price, 1) AS price_change
FROM stock_prices;
stat_diff
差分を計算する。order 次の差分を適用する。先頭 order 行は NULL。
構文: stat_diff(column, order)
| パラメータ | 説明 |
|---|---|
order |
差分の次数(整数) |
-- 1次差分(前日比)
SELECT date, price,
stat_diff(price, 1) AS daily_change
FROM stock_prices;
-- 2次差分(加速度)
SELECT date, value,
stat_diff(value, 2) AS acceleration
FROM time_series;
stat_seasonal_diff
季節差分を計算する。period 期前の値との差を返す。先頭 period 行は NULL。
構文: stat_seasonal_diff(column, period)
| パラメータ | 説明 |
|---|---|
period |
季節周期(整数) |
-- 前年同月比(月次データ、周期12)
SELECT month, sales,
stat_seasonal_diff(sales, 12) AS yoy_change
FROM monthly_sales;
-- 前週同曜日比(日次データ、周期7)
SELECT date, visitors,
stat_seasonal_diff(visitors, 7) AS wow_change
FROM daily_traffic;
外れ値検出
stat_outliers_iqr
IQR 法で外れ値を検出する。Q1 - 1.5IQR 未満または Q3 + 1.5IQR 超の値を外れ値(1.0)、それ以外を正常値(0.0)として返す。NULL 行は NULL。
構文: stat_outliers_iqr(column)
-- 外れ値フラグの付与
SELECT id, value,
stat_outliers_iqr(value) AS is_outlier
FROM measurements;
-- 外れ値を除外した平均
SELECT stat_mean(value) AS mean_without_outliers
FROM (
SELECT value
FROM measurements
WHERE stat_outliers_iqr(value) = 0.0
);
stat_outliers_zscore
Z スコア法で外れ値を検出する。|z| > 3 の値を外れ値(1.0)として返す。
構文: stat_outliers_zscore(column)
SELECT id, value,
stat_outliers_zscore(value) AS is_outlier
FROM measurements;
stat_outliers_mzscore
修正 Z スコア法で外れ値を検出する。中央値と MAD を使用するロバストな方法。|修正Zスコア| > 3.5 の値を外れ値(1.0)として返す。
構文: stat_outliers_mzscore(column)
-- ロバストな外れ値検出
SELECT id, value,
stat_outliers_mzscore(value) AS is_outlier
FROM measurements;
-- 3手法の比較
SELECT id, value,
stat_outliers_iqr(value) AS iqr,
stat_outliers_zscore(value) AS zscore,
stat_outliers_mzscore(value) AS mzscore
FROM measurements;
ロバスト処理
stat_winsorize
ウィンザライズ(裾刈り)を行う。指定パーセンタイルで上下の極値をクリップする。
構文: stat_winsorize(column, percentile)
| パラメータ | 説明 |
|---|---|
percentile |
クリップするパーセンタイル(整数、例: 5 → 5%ile と 95%ile でクリップ) |
-- 5パーセンタイルでウィンザライズ
SELECT id, value,
stat_winsorize(value, 5) AS winsorized
FROM measurements;
-- ウィンザライズ後の統計量
SELECT stat_mean(w) AS winsorized_mean
FROM (
SELECT stat_winsorize(value, 10) AS w FROM measurements
);