ずばりの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だけで何とかできないものでしょうか?
Postgresqlは使用したことがないので、答えられません。
すみません。
参考までに、Sybase や Oracle などでは、カーソルというSELECTしてきたデータを1行づつ参照したり、そのデータを利用して何か処理をしたり、加工したデータを処理結果としてPutしたりという手法があります。
おそらく、典型的なパターン(カーソルで取得してきたデータを、If-EndIf などの構文で囲む方法)で出来ると思いますので、ヘルプや参考書に書いてあるプロシージャ等の記述をアレンジすればOKだと思います。
なるほど。カーソルって奴ですね。
少し開けてきました。
ありがとうございます。
すみません。そういえば書いてませんでした。
Postgresqlを使用します。
バージョンは7.4.1です。
ストアドプロシージャですか…。
あまり書ける自信が…。