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

データクレンジング

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

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …

no image

Webの高速化に関して

Webの高速化に関してメモ。 高速化って言っても幅広いんですけどね。自分が行なっている対策に関して。 一応LAMP環境を前提にしてます。 Contents1 一番大事なのは測定2 DB対策3 フロント …

no image

cakeでのトランザクション、コミット、ロールバック

cakePHP(2.X系)でのトランザクション、コミット、ロールバックについて。 cakePHPでトランザクションを書ける場合、Model内に [crayon-669fbb5ce2de28821597 …

no image

MariaDBインストール

CentOS7からはyumでmysqlをインストールするとMariaDBがディフォルトになるようです。 せっかくなので、これを機にMariaDBを使ってみました。といってもMySQLとほとんど一緒でし …

アーカイブ