はじめに
データベースを利用する目的の1つとして,
リレーショナルデータベースとSQLにおいては,
そうすると当然,
具体的には,
まあ,
- 注1)
- もし列持ちの形式を取るとすれば,
固定的な結果を出力するためのテーブルとして使用する場合でしょう。しかし, 列数を拡張することはコストがかさむため, これはあくまで例外的なケースですし, また本章で見るように, 行持ちから列持ちの形式へ変換することが可能なため, 基本的には行持ちの形式をとるべきです。
まずは基本
直近を求める
まずは基本的な時系列分析から始めましょう。時系列にデータを比較する場合,
表1 LoadSampleテーブル
sample_ | load |
---|---|
2008-02-01 | 1024 |
2008-02-02 | 2366 |
2008-02-05 | 2366 |
2008-02-07 | 985 |
2008-02-08 | 780 |
2008-02-12 | 1000 |
まずは,
リスト1 過去の直近を求める
SELECT sample_date AS cur_date,
MIN(sample_date)
OVER (ORDER BY sample_date ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS latest
FROM LoadSample;
図1 リスト1の実行結果
cur_date latest -------- -------- 08-02-01 08-02-02 08-02-01 08-02-05 08-02-02 08-02-07 08-02-05 08-02-08 08-02-07 08-02-12 08-02-08
2月1日より前のデータはこのテーブルには登録されていないので,
これを実装非依存のクエリにするには,
リスト2 直近
SELECT LS0.sample_date AS cur_date,
(SELECT MAX(sample_date)
FROM LoadSample LS1
WHERE LS1.sample_date < LS0.sample_date) AS latest
FROM LoadSample LS0;
これも結果はリスト1と同じです。ポイントはWHERE句の
リスト3 直近
SELECT LS0.sample_date AS cur_date,
MAX(LS1.sample_date) AS latest
FROM LoadSample LS0
LEFT OUTER JOIN LoadSample LS1
ON LS1.sample_date < LS0.sample_date
GROUP BY LS0.sample_date;
- 注2)
- Oracleには,
これをもっと簡略化したLAGという関数があります (未来へ進むならLEAD関数)。独自拡張の関数のためここでは紹介しませんが, Oracleユーザの方は使い方を試してみてください。