SQL文の構築について教えてください。
こんばんは。Oracle9iのデータベース検索で、どうしてもSQLが思い浮かばないため、質問させていただきます。
■Table
ID NUM SIGN
100 1 A
100 2 A
101 1 A
102 1 B
103 1 B
104 1 C
首キーはID、NUMです。
上記のようなテーブルで、
IDが同一かつNUMが最大のもので、
SIGNが同一のレコードで、2件以外のレコードを抽出したいです。
(例表でいうと、ID104のレコードのみが抽出されるようにしたい)
すこし急ぎなんですが、SQLが得意でお時間がある方、力を貸していただけないでしょうか。
よろしくお願い致します。
No.6ベストアンサー
- 回答日時:
こんにちは
SELECT ID, NUM, SIGN
FROM
(SELECT ID, NUM, SIGN, COUNT(ID) OVER(PARTITION BY SIGN) AS SIGN_COUNT
-- ここでSIGNの数を数える
FROM
(SELECT ID, NUM, MAX(NUM) OVER(PARTITION BY ID) AS MAX_NUM, SIGN
-- 後ではじくために、NUMとMAX(NUM)を取得
FROM Table)
WHERE NUM = MAX_NUM
-- NUMが最大のものだけ抽出
)
WHERE SIGN_COUNT != 2
-- ここで初めてSIGNの件数で抽出
考え方はこれでいいと思いますが、SQL的にチューニングの余地はかなりありますね・・・。
(もっといい書き方があると思います)
何しろ今Oracleが手元にないもので・・・。
テストしてません^^;
No.5
- 回答日時:
あぁ・・・、何となく意味がわかったような気が・・・。
一発目にSIGNをカウントするから駄目なのね?
まずIDごとのMAX(NUM)レコードだけ引っ張って、それからSIGNを数えるって事?
あとひとつわかりません・・・。
(これによってSQLが根本的に変わってきます)
今は
ID NUM SIGN
100 1 A
100 2 A
だけど、
ID NUM SIGN
100 1 A
100 2 B
とかってあるんですか?
もしあったら、100,1,Aは無視?
それともSIGNが違うから、検索対象になり得る???
この回答への補足
>まずIDごとのMAX(NUM)レコードだけ引っ張って、それからSIGNを数えるって事?
その通りです。説明不足で申し訳ありません。
同じIDのSIGN違いの場合もあります。
その場合も、IDごとの最大のNUMを扱いたいです。
>もしあったら、100,1,Aは無視?
無視でOKです。扱いたいのは同じIDの中でNUMが最大の「100,2,B」です。
No.4
- 回答日時:
こんにちは
すみません・・・、捕捉で結構ですので、もう少し整理しましょう。
結局、
ID NUM SIGN
100 1 A
100 2 A
101 1 A
102 1 B
103 1 B
104 1 C
104 2 C ←(今回追加)
とあった場合に抽出する対象はどのレコードですか?
できればその条件も・・・。
この回答への補足
こんにちは。お世話になります。
抽出結果は、「104 2 C」のレコードのみを期待しています。
条件は、
IDが同一かつNUMが最大のもので、SIGNが同一のレコードで、
検索結果が2件以外のレコードを抽出したいです。
IDが「104」のものは2件ありますが、NUMが最大のレコードは「104 2 C」なりますので、
SIGNが「C」のレコードは検索結果1件とします。
SIGN「A」「B」はそれぞれ検索結果2件なので、最終的な結果からは対象外となり、
SIGN「C」は検索結果が2件以外(1件)なので、最終的な結果の対象にします。
すみませんが、宜しくお願い致します。
No.3
- 回答日時:
こんばんは
>テーブルに 「104,2,C」をINSERTすると・・・
だって、「104,1,C」もあるんですよね?
それだったら「100,2,A」も出てこなくちゃなりませんが・・・?
>SIGNが同一のレコードで、2件以外のレコードを抽出したいです。
最初の要件を満たしていないです。
この回答への補足
私の表現が悪かったようです。すみません。
>IDが同一かつNUMが最大のもので、
>SIGNが同一のレコードで、2件以外のレコードを抽出したいです。
最終的な抽出は、同一IDはNUMが最大のもののみを1件分としてカウントをしたいのです。
今日も時間があけばもう少し考えてみようと思います。
No.2
- 回答日時:
あちゃー
COUNT(列名、列名)は駄目ですね・・・。
IDだけでよかったです。
失礼しました・・・。
本日デバッグ致しました。
最後のWhere条件を SIGN=1 を SIGN<>2 に変更したところ、うまく抽出できました。
本当にありがとうございます。
ただ1点だけ問題がありまして、
テーブルに 「104,2,C」をINSERTすると、私の思いは「104,2,C」のみを抽出したいのですが、
抽出件数0件になってしまいます。
同じIDの場合は、NUMの最大値で抽出したいのですが、
DISTINCTやGROUP BYで試しましたが、うまくいきませんでした・・・
もしよろしかったらヒントを頂けますでしょうか。
No.1
- 回答日時:
こんばんは
えーと、取り急ぎという事で、未検証です・・・。
SELECT ID, NUM, SIGN
FROM (SELECT ID, MAX(NUM) OVER(PARTITION BY ID) AS NUM, COUNT(ID, NUM) OVER(PARTITION BY SIGN) AS SIGN
FROM Table)
WHERE SIGN = 1
早いご回答ありがとうございます。
そのまま実行してみたところ、COUNTのところでエラーが出てしまいました。
しかし、OVER、PARTITION BY というやり方は初めて見ました。
分析関数というものなんですね。使えそうな感じがするのでいろいろ改造してみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Oracle 列1と列2の関係性で列3の条件に一致するレコードを抽出したい 1 2022/04/13 07:46
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
連続したデータを条件とするSQL...
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
osqleditについて
-
SELECT FOR UPDATE で該当レコ...
-
ACCESS2007のエクスポート上限
-
BLOB型項目をSQLの検索条件に指...
-
レコードの更新履歴について
-
アクセスのレポートでレコード...
-
SQL*Loader Append
-
SQLで条件にヒットしたレコード...
-
where句中のtrim関数について
-
PL/SQL内の共通関数の引数にフ...
-
なぜ、WHERE句とHAVING句がある...
-
SQL LIKE演算子 抽出できない
-
引数によってwhere句を切り替え...
-
「数字で始まらない」ものを抽...
-
抽出データの欠落
-
group byの並び順を変えるだけ...
-
SQLローダーCSV取込で、囲み文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
AccessのSQL文で1件のみヒット...
-
SELECT FOR UPDATE で該当レコ...
-
where句中のtrim関数について
-
group byの並び順を変えるだけ...
-
アクセスのレポートでレコード...
-
SQLで条件にヒットしたレコード...
-
ORMについて
-
トランザクションログを出力せ...
-
データ
-
SQL*Loader Append
-
「数字で始まらない」ものを抽...
-
引数によってwhere句を切り替え...
-
BLOB型項目をSQLの検索条件に指...
-
osqleditについて
-
ACCESS レコードの並び順について
-
大量レコードをTRUNCATEせずに...
-
【SQL】違うフィールド同士の集...
-
updateで複数行更新したい
おすすめ情報