• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:枝番の最大値とその前のデータを取得したい)

最新と一つ前のデータを取得する方法

このQ&Aのポイント
  • Oracle7を使用して、同一見積番号の最新と一つ前のデータのみを抽出する方法を教えてください。
  • データ量が多い場合でも、効率的な方法で最新と一つ前のデータを取得する方法を教えてください。
  • 副問い合わせを使用して最新のデータを取得する方法はわかりますが、一つ前のデータを取得する方法がわかりません。どのようにすれば効率的に取得できるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; たぶん、これで良いはず。

その他の回答 (1)

回答No.1

古いオラクルで最も簡素に書く方法。 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は検索方法が全く異なるので、どちらが速いかは環境次第。 すべて未検証(=目視確認)です。

関連するQ&A