いくつかの条件に基づいて、前の 2 つのレコードを取得するクエリがあります。これは正常に機能しますが、少なくとも 3 つのレコードがないとアイテムが見つかりません。そのため、以下のクエリを変更する必要がありますが、その方法がよくわかりません。
select t1.index
, t1.date
, t1.flag
, t2.date
, t2.flag
, t3.date
, t3.flag
from table t1
left outer join table t2
on t2.index = t1.index
left outer join table t3
on t3.index = t1.index
where t1.flag = '30'
and t1.date >= to_date('05/08/2013','MM/DD/YYYY')
and t2.date = (select max(t2a.date) from table t2a
where t2a.index = t1.index
and t2a.date < t1.date)
and t3.date = (select max(t3a.date) from table t3a
where t3a.index = t1.index
and t3a.date < t2.date)
したがって、同じインデックス フィールドを持つレコードが少なくとも 3 つある限り、最新のレコード (t1) が検索され、次に最新のレコード (t2)、その次のレコード (t3) が検索されます。日にち。
私はラグ関数を使用していましたが、複雑なリンクと順序付けに基づいて、信頼できるものは得られませんでした (インデックスが 1 つのテーブルにあり、別のテーブルの日付が 3 番目のテーブルを介してリンクされているため、この例は馬鹿げています)。
基本的に、where ステートメントは、「既に見つかった日付よりも小さい基準に一致する最大日付を見つけるか、それ以上見つからない場合は問題なく、見つけたものを返す」ようにしたいと考えています。「または、それ以上何も見つからなかった場合」をどのようにコーディングしますか?