dポイントプレゼントキャンペーン実施中!

Oracle7で以下のような結果を得るにはどのようなSQLが
あるでしょうか?

見積もりテーブル
見積NO 枝NO 件名 金額
0001 00  ああああ 10000
0002 00  いいいい 15000
0001 01  あああい 11000
0001 02  あああう 12000
0003 00  うううう 20000
0002 01  いいいう 16000
0002 02  いいいえ 17000

結果
見積NO 枝NO 件名 金額
0001 01  あああい 11000
0001 02  あああう 12000
0002 01  いいいう 16000
0002 02  いいいえ 17000
0003 00  うううう 20000

同一見積NOに変更した回数分枝NOがつくデータで、
最新とその一つ前のデータのみを抽出したいのです。

最新であれば副問い合わせでMAXを利用すればできそうですが、
その一つ前となると、やり方がわかりません。
また、データ量が多いので毎回MAXを副問い合わせしていると
検索に時間がかかりすぎる予感もするのですが・・・

よろしくお願いします。

A 回答 (2件)

R8.1.x以降でしか動かないことに気づいた。

(サブクエリでのORDERが出来ない)

> 古いオラクルで、同じような考え方を取ると
> select x.見積NO,x.枝NO,x.件名,x.金額
> from
> (select x.*,rownum R_NO from (select * from 見積 order by 見積NO,枝NO desc) x),
> (select y.*,min(R_NO) R_START
> from (select x.*,rownum R_NO from (select * from 見積 order by 見積NO,枝NO desc) x
> group by x.見積NO) y) z
> where x.見積NO=z.見積NO and (R_NO - R_START) <= 1;

R8.0.x以前でも動くように、さらなる変更。

select A.見積NO,A.枝NO,A.件名,A.金額
from
(select x.*,rownum R_NO from (select distinct 見積NO,枝NO,件名,金額 from 見積) x) A,
(select y.*,max(R_NO) R_END
from (select x.*,rownum R_NO from (select distinct 見積NO,枝NO,件名,金額 from 見積) x
group by x.見積NO) y) z
where A.見積NO=z.見積NO and (R_END - R_NO) <= 1;

たぶん、これで良いはず。
    • good
    • 0

古いオラクルで最も簡素に書く方法。


select * from 見積 x
where
(select count(*) from 見積 y where x.見積NO=y.見積NO and x.枝NO<y.枝NO) < 2
;
ちょっと検索量が多い。

最近のオラクルで分析関数を使うと
select 見積NO,枝NO,件名,金額
from
(select x.*,row_number() over(partition by 見積NO order by 枝NO desc) R from 見積 x)
where R<=2;
のように書けて速い。

古いオラクルで、同じような考え方を取ると
select x.見積NO,x.枝NO,x.件名,x.金額
from
(select x.*,rownum R_NO from (select * from 見積 order by 見積NO,枝NO desc) x),
(select y.*,min(R_NO) R_START
from (select x.*,rownum R_NO from (select * from 見積 order by 見積NO,枝NO desc) x
group by x.見積NO) y) z
where x.見積NO=z.見積NO and (R_NO - R_START) <= 1;
な感じで、ROWNUMを使って同じようなことが出来る。
これなら古いオラクルでも動く。
最初に書いたSQLと最後に書いたSQLは検索方法が全く異なるので、どちらが速いかは環境次第。

すべて未検証(=目視確認)です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す