SQLについて

ずばりのSQLを書いていただいた方には100ポイント!

次のようなテーブルがあるとします。

テーブルA カラム名-date
1/5
1/15
1/18
3/11
3/17
3/18
4/17

テーブルB カラム名-date
1/2
1/16
1/17
3/12
3/19
3/20
3/21
4/2
4/16

ここで、次の条件で値を取得するとします。
ルールは、
1)Aの日付よりもBの日付が過去
2)Aの日付よりBの日付は1ヶ月以内
3)Bの日付のうち、古い順に取得。既に取得されている値は取得できない
4)さらに3件前までしか選択できない
5)あればBの日付を取得、あてはまるものがなければ、null

結果として、Aの全ての値に対しての次のような値を取得したいと考えています。
1/5 1/2 ←1,2,3より
1/15 null ←1,2,3、5より
1/18 1/16 ←1,2,3より
3/11 null ←1,2,3、5より
3/17 3/12 ←1/17は2に合わないため、次の3/12
3/18 null ←1,2,3、5より
4/17 3/21 ←3/19、3/20は4に合わないため、選択できうる中で3件前の3/21

これを作るのに、SQLだけで何とかできないものでしょうか?

回答の条件
  • 1人3回まで
  • 登録:2006/07/05 12:53:00
  • 終了:2006/07/10 08:44:41

回答(2件)

id:careplanner No.1

らいず回答回数338ベストアンサー獲得回数132006/07/05 17:13:03

ポイント20pt

この全ての条件を満たすには、DBは何を使用するのでしょう?

おそらく、ストアドプロシージャ等を利用しないと難しいように

思います。

id:iiiiiiiii

すみません。そういえば書いてませんでした。

Postgresqlを使用します。

バージョンは7.4.1です。

ストアドプロシージャですか…。

あまり書ける自信が…。

2006/07/05 17:37:37
id:careplanner No.2

らいず回答回数338ベストアンサー獲得回数132006/07/06 11:16:52

ポイント50pt

Postgresqlは使用したことがないので、答えられません。

すみません。

参考までに、Sybase や Oracle などでは、カーソルというSELECTしてきたデータを1行づつ参照したり、そのデータを利用して何か処理をしたり、加工したデータを処理結果としてPutしたりという手法があります。

おそらく、典型的なパターン(カーソルで取得してきたデータを、If-EndIf などの構文で囲む方法)で出来ると思いますので、ヘルプや参考書に書いてあるプロシージャ等の記述をアレンジすればOKだと思います。

id:iiiiiiiii

なるほど。カーソルって奴ですね。

少し開けてきました。

ありがとうございます。

2006/07/06 11:46:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません