skillup

技術ブログ

Database

サブクエリ 移動平均など

投稿日:

前回の応用編です。

日付、入出金、残高はできましたが、ここからさらに、現在のレコードから3行以内(3行あれば3行、なければそれ以内でできるだけ)のレコードの合計値を出す計算を考えます。

結果だけ先に書くと下記のようになります。

prc_date | prc_amt | sum
————+———+——-
2006-10-26 | 12000 | 12000
2006-10-28 | 2500 | 14500
2006-10-31 | -15000 | -500
2006-11-03 | 34000 | 21500
2006-11-04 | -5000 | 14000
2006-11-06 | 7200 | 36200
2006-11-11 | 11000 | 13200

SQL自体ですが、これは前回の下記のSQLに制限をかけるとわかりやすいです。

4行目の合計値に制限を付けます。

要はすべての合計値ではなく、a1.prc_dateとa2.prc_dateの間が常に3行以内になるデータが存在するということをSQLで表現します。

イメージでいうとEXISTSみたいなかんじに近いですかね。

要は1.prc_dateとa2.prc_dateの間に3行以内のレコードが存在すればいいので、下記のようなSQLを追加することになります。

といっても私は自力では思いつけなかったです。達人に学ぶSQL徹底指南書の模範解答をみて、具体値を入れた後、図に書き出して初めてイメージがつかめました。

こういうところはプログラムって数学に近いですね。本には非常にわかりやすい説明が載っていますが・・・・

時間の重複

以前、予約管理システムをつくったときにもやりましたが、宿泊のシステムなどを作った時に重複しているか否かをみるロジックをSQLで書いてみます。

以下のようなタイムテーブルがあるとします。

例によってデータはすべてここにあります。

reserver | start_date | end_date
———-+————+————
木村 | 2006-10-26 | 2006-10-27
荒木 | 2006-10-28 | 2006-10-31
堀 | 2006-10-31 | 2006-11-01
山本 | 2006-11-03 | 2006-11-04
内田 | 2006-11-03 | 2006-11-05
水谷 | 2006-11-06 | 2006-11-06

ここから重複を導くSQLは下記のようになります。基本的に数直線を書けばすぐわかるかと思います。

以前にこのエントリーで紹介しましたが、こういった書き方もできます。ただBetweenを使ったほうが直感的でわかりやすいかな・・・

これまた数直線を書いていろいろイメージしてみるとすぐにわかるかと思います。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

SQL結合 サブクエリに関して

今回はサブクエリに関してです。 もちろんSQL実践入門を読み進めています。 SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。 以下 …

no image

データクレンジング

リレーショナルデータベースでデータを管理する前に、しなくてはいけないことはデータをデータベースに登録できる形に整形することです。 このことをデータクレンジングといいます。 これを行わずに何も考えずにデ …

no image

データベース設計のアンチパターン 複数表結合,大作SQL,Blob型の乱用

データベースのアンチパターンに関して。 以前下記ブログでも書いたんですが設計のスキルに関してもう少し身に着ける必要があるとおもい、チェックします。 論理設計のグレーノウハウ サロゲートキー 論理設計の …

no image

SQLで数列を扱う

今回はSQLで数列を扱ってみましょう。 例えば下記のような0から9までの数字が書かれている数列があったとして、 これにより連番を作成してみましょう。 digit ——- 0 1 …

no image

データベースのインデックスについて

今回はデータベースのインデックスに関して。 検索条件を早くする場合、何よりも速度が速くなるのはインデックスを張ることでしょう。 インデックスを張ることは単語を索引順に並べることですので、劇的に速度が向 …