分12はじめにデータベースを利用する目的の1つとして,過去の情報を時系列順に,文字通り「データの集積」として保持する用途があります。した情報は,たとえばシステムのパフォーマンスログや会社の財務状況,あるいは集団の人口推移だったりするでしょう。多くの業務では,こうした過去のデータへ遡って現在と比較する,あるいは過去の2点や期間同士を比較して将来の指針を策定する手がかりとすることが重要になります。いわゆる「データウェアハウス」と総称される用途です。リレーショナルデータベースとSQLにおいては,そうした時系列的なデータの多くは,「⁠時間」を表す列(時刻,日付,年度などなど)をキーとして,異なる時刻のデータは異なる行として保持するのが一般的なテーブル設計です。これを「列持ち」の形で保持することは,例外的なケースに属します(注1⁠)⁠。すると当然,ある2点の時刻におけるデータを比較するためには行間比較が必要となります。そのために必要な記述方法の基礎を学ぶことが本章の目的です。手続き型言語でファイルを扱う場合には,こういう行間比較のためには「ループ」による処理が基本となりますが,SQLには文単位のループは一切現れません。代わりにSQLは,独自の原理に基づいた方法を用います。具体的には,標準SQLの新しい機能であるOLAP関数を利用する方法と,従来の自己結合(相関サブクエリ)を使う方法の2通りを紹介します。この両者を学ぶことには,SQLに存在する手続き型的な側面と集合指向的な側面を一挙に学ぶことができるというメリットがあります。したことは,本章を読み進む過程で追々わかってくるでしょう。今は,頭の片隅にメモ程度に覚えておいていただければ結構です。それでは,早速始めましょう。注1)もし列持ちの形式を取るとすれば,固定的な結果を出力するためのテーブルとして使用する場合でしょう。列数を拡張することはコストがかさむため,これはあくまで例外的なケースですし,また本章で見るように,行持ちから列持ちの形式へ変換することが可能なため,基本的には行持ちの形式をとるべきです。直近を求めるまずは基本的な時系列分析から始めましょう。時系列にデータを比較する場合,基本となるのは,時系列に従って,1行ずつ過去へ遡る,または未来へ進むSQLです。サンプルに,表1のようなサーバの時間ごとの負荷量を記録したテーブルを使います。サンプリングは思いついたときに不定期に行われるため,不連続で間隔もランダムな日付が格納されています。1000まずは,各行について過去の直近の行を求めてみましょう。OLAP関数を使える実装ならば,リスト1のような簡潔な書き方で実現できます(実行結果は図1:注2⁠)⁠。08-02-082月1日より前のデータはこのテーブルには登録されていないので,2月1日の行については直前の日付はNULLです。2月2日以降についてはそれぞれ直前の日付が存在するので,これがlatest列に入ることになります。PRECEDING」によって,OLAP関数が動く範囲をあくまでsample_dateでソートした場合の直前の1行に限定していることです。普通,「⁠BETWEEN」というのは,複数行の範囲を指定するために使う場合が多いのですが,ここはあえて範囲を1行に限定するために利用しています。これを実装非依存のクエリにするには,OLAP関数の部分を相関サブクエリに書き換えます(リスト2⁠)⁠。LS0;これも結果はリスト1と同じです。LS0.sample_date」という非等値結合です。この意味は,カレント行(LS0)のsample_dateより小さい日付の集合(LS1)から,最大の日付を選択する,ということです。このクエリの意味がわかりづらいなら,相関サブクエリを自己結合に変えたものを見るとわかりやすくなるでしょう(リスト3⁠)⁠。LS0.sample_date;注2)Oracleには,これをもっと簡略化したLAGという関数があります(未来へ進むならLEAD関数⁠)⁠。独自拡張の関数のためここでは紹介しませんが,Oracleユーザの方は使い方を試してみてください。データベース著者プロフィールミックSI企業に勤務するDBエンジニア。データウェアハウス業務に従事している。自身のサイト「リレーショナル・データベースの世界」でデータベースとSQLについての技術情報を公開している。Press』で「SQLアタマアカデミー」を連載中。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。