skillup

技術ブログ

Database

サブクエリ 応用編

投稿日:

本日も引き続きサブクエリです。

前回とちょっと近いですが、下記のような歯抜けのテーブル(sales2)があるとします。

year | sale
——+——
1990 | 50
1992 | 50
1993 | 52
1994 | 55
1997 | 55

これの前回の年(例えば1992なら1990)との売り上げの比較を見てみましょう。

前回より難しいのが前回の年が昨年ではないので、現在の年-1などのような公式は使えません。

そこで対象の年より過去の中で最大の年を求める必要があります。

例えば対象の年が1994年だとしたら1993,1992,1991年の中で最大の年は1993年になります。)このプロセス自体が結構ややこしいです。

まず下記で直近の年を出します。

year | sale | last_year
——+——+———–
1990 | 50 |
1992 | 50 | 1990
1993 | 52 | 1992
1994 | 55 | 1993
1997 | 55 | 1994

このlast year自体を検索に使い、金額を出します。

year | sale | last_year | last_sale
——+——+———–+———–
1990 | 50 | |
1992 | 50 | 1990 | 50
1993 | 52 | 1992 | 50
1994 | 55 | 1993 | 52
1997 | 55 | 1994 | 55

ちなみに自己結合でやると下記のように書けます。最初の年がでません。

WHERE句を理解するのが少し難しいですが、なぜこれで抽出できるのかは実際にテーブルが作られるのをイメージすればわかりやすいかと思います。

ちなみに下記のように自己外部結合を使うと最初の年もでます。

LEFT JOINで最初のテーブルの情報が失われないためです。

これは結構概念的に難しいですね。ONの使い方に注意しておきましょう。

毎度毎度、自己結合は役に立ちますね・・かなり使えると思っているのですが、私は達人に学ぶSQL徹底指南書を読むまでは知りませんでした。

なぜに有益なのに知られていないのでしょうか・・・

-Database
-

執筆者:


comment

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

関連記事

no image

herokuでMySQL

昨日に続き、heroku+MySQLのメモです。 herokuはディフォルトではPostgreSQLですが、アドオンを使うとMySQLも使えるようになります。 使い方ですが、herokuの管理画面でク …

no image

論理設計のグレーノウハウ 列持ちテーブル、集計キー、多段ビュー

前回に引き続き論理設計のグレーノウハウについて。 Contents1 列持ちテーブル1.1 メリット1.1.1 シンプルな設計1.1.2 入出力のフォーマットと合わせやすい1.2 デメリット1.2.1 …

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

SQLにおけるナンバリング

本日はナンバリングに関して。 MySQLを使っていますと各テーブルにはid int not null auto_increment primary keyなどと打って主キーを打つことがほぼ習慣になって …

no image

NOT EXISTSの利用2

今回もNOT EXISTSの利用です。 前回の問題にプラスアルファし、列が一緒でないと連続でも意味ない仕様にします。 例えば下記のようなテーブルがあるとします。 seat | row_id | sta …

アーカイブ