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を副問い合わせしていると
検索に時間がかかりすぎる予感もするのですが・・・
よろしくお願いします。
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;
たぶん、これで良いはず。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- Access(アクセス) MAXで0が出力される 1 2022/03/31 21:43
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
- Oracle SQL update方法 2 2022/06/22 14:07
- Visual Basic(VBA) VBAで大量データの処理 3 2022/11/15 21:53
- Google Maps エクセルについて 2 2022/11/27 11:00
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleで「文字が無効です」の...
-
枝番の最大値とその前のデータ...
-
2つの列が同じ値の行を取得するSQL
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
データ
-
テーブルの最後(最新)のレコー...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
1の行を固定した上でVBAを用い...
-
レコードの登録順がおかしい
-
<SQL>重複しているデータの場合...
-
引数によってwhere句を切り替え...
-
SELECT FOR UPDATE で該当レコ...
-
SQLで条件にヒットしたレコード...
-
複数のテーブルから値を合計出...
-
あるカラムに同じ値を持つレコ...
-
SQL文 複数実行
-
count関数の値をwhere句で使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つの列が同じ値の行を取得するSQL
-
Oracleで「文字が無効です」の...
-
PL/SQLで…SQLの実行結果を変数...
-
枝番の最大値とその前のデータ...
-
並び替えた後の表の結合
-
同じテーブルからviewを作成し...
-
UPDATE文のWHERE句にファンクシ...
-
最新かつ最大の値を求める
-
Accessオプションボタン vba case
-
Oracleでビット演算はできますか?
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
count関数の値をwhere句で使用...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
レコードの登録順がおかしい
-
<SQL>重複しているデータの場合...
-
AccessのSQL文で1件のみヒット...
おすすめ情報