質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

2回答

829閲覧

SELECT結果から同じ条件のデータが5行以上あるものをSELECTしたい

JuguarSugar

総合スコア83

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/04/23 03:04

編集2021/04/23 06:36

下記のコードとデータを確認してください。

SELECT a.患者コード,MAX(b.基準日) as 基準日,a.測定日,COUNT(*) FROM A a LEFT JOIN B b ON a.患者コード = b.患者コード AND a.測定日 >= b.基準日 GROUP BY a.患者コード,a.測定日
患者コード基準日測定日COUNT(*)
111120141220201508217
111120141220201509022
111120141220201509113
111120141220201509164
111120141220201509183
111120141220201509253
111120141220201509292
111120141220201510033
498920181112201812272
1529620180109201802213
1529620180109201803073
3471120200805202012263
3471120200805202101162
3521220151120201601052
3521220151120201601204
3521220151120201602122
3521220151120201603093
3521220151120201604082

テーブルAとテーブルBは患者コードで紐づいています。
基準日に対して測定日があり、重複した測定データがあります。(COUNT(*)は同じ測定日のデータの個数を表しています。)
グループ化することで同じ測定日のレコードを1行にまとめています。

追記:また、基準日は1人の患者に対して2つ以上ある場合もあります。

このSELECT結果より、同じ患者コードかつ同じ基準日のレコードが5行以上あるものだけ
SELECTするにはどうしたらよろしいでしょうか。

追記:最終的には下記のようなSELECT結果になることを望んでいます。

患者コード基準日測定日COUNT(*)
111120141220201508217
111120141220201509022
111120141220201509113
111120141220201509164
111120141220201509183
111120141220201509253
111120141220201509292
111120141220201510033
3521220151120201601052
3521220151120201601204
3521220151120201602122
3521220151120201603093
3521220151120201604082

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/04/23 03:40

欲しい結果 (同じ患者コードかつ同じ基準日のレコードが5行以上あるもの) がどのようなものか、いまいち分かりづらいので、具体的にお示しください。
mather

2021/04/23 06:02

> テーブルAとテーブルB 具体的なレコードのサンプルを提示しましょう。 同じ患者コードには基準日が一つしか無いようですが、Bテーブルはそういった構成になっているのでしょうか。 > 基準日に対して測定日があり 「a.測定日 >= b.基準日」とあるので測定日よりあとであることが条件なのですね? > このSELECT結果より、同じ患者コードかつ同じ基準日のレコードが5行以上あるものだけSELECTする 「5行以上あるものだけ」とは、例えば「患者コード 1111, 35212 の行のみ」ということでしょうか? 具体的な期待される結果をレコードの形で示したほうが良いと思います。
guest

回答2

0

Oracle なら WITH が使えると思うので、こんな感じでしょうか。

sql

1WITH t AS ( 2 SELECT a.患者コード,MAX(b.基準日) as 基準日,a.測定日,COUNT(*) 3 FROM A a 4 LEFT JOIN B b ON a.患者コード = b.患者コード AND a.測定日 >= b.基準日 5 GROUP BY a.患者コード,a.測定日 6) 7SELECT * 8FROM t 9WHERE 患者コード IN 10 (SELECT 患者コード FROM t GROUP BY 患者コード HAVING COUNT(*) >= 5)

ちなみに、元のクエリーの LEFT JOIN って単に JOIN の方が良いのでは。

投稿2021/04/23 08:18

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

このSELECT結果より、同じ患者コードかつ同じ基準日のレコードが5行以上あるものだけ
SELECTするにはどうしたらよろしいでしょうか。

質問のSELECTを、患者コードと基準日でgroup by して件数が5件以上のものを条件にする。

SQL

1select * 2FROM A a 3 LEFT JOIN B b ON a.患者コード = b.患者コード AND a.測定日 >= b.基準日 4where (a.患者コード, b.基準日) in ( 5 select 患者コード, max_基準日 6 from ( 7 -- 質問のSELECT 8 SELECT a.患者コード,MAX(b.基準日) as max_基準日,a.測定日 9 FROM A a 10 LEFT JOIN B b ON a.患者コード = b.患者コード AND a.測定日 >= b.基準日 11 GROUP BY a.患者コード,a.測定日 12 ) b 13 group by 患者コード, max_基準日 14 having count(*) >= 5 15 )

投稿2021/04/23 04:15

編集2021/04/23 08:17
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JuguarSugar

2021/04/23 07:29

すみません、エラーになります。 ORA-00904: "基準日": 無効な識別子です。 00904. 00000 - "%s: invalid identifier" *Cause: *Action: 行4 列4でエラー
sousuke

2021/04/23 07:30

Oracleはちょっとわからないんですがcount(*)の列にエイリアスつけなくても大丈夫なんです? あとこれはそもそも論になってしまいますが「select max(基準日) ~~ GROUP BY a.患者コード,a.測定日」で基準日をカウントするとなるとmaxの中に基準日が消え失せてる可能性があるんでSQL見ても正直何がしたいのかわかりにくいですね…
sazi

2021/04/23 08:12

@JuguarSugarさん SQLを変更しました。これでも同じエラーが出るなら、参照しているテーブルに基準日が無いという事になります。 @sousukeさん 参照していないからエラーにはならないと思いますが、使用しないので回答からは消しました。 基準日はcount()ではなくMax()ですので、気になると言われているポイントが良く分かりません。
sazi

2021/04/23 08:16

@JuguarSugarさん 訂正。基準日はbテーブルですね。 SQL修正します。
JuguarSugar

2021/04/23 08:27

@sazi さん おお、いきました。 ありがとうございました。
sousuke

2021/04/23 08:50

@sazi氏 仕組みがわからないので想像ですが、あくまで「max(基準日)の数」なので 『患者コード:35212、基準日:20151121、測定日:20160105』 っていう同一測定日の基準日違いのデータを足すとmax(基準日)が容易にずれて 中のselectの結果が 患者コード:35212、基準日:20151121、測定日:20160105 患者コード:35212、基準日:20151120、測定日:20160120 患者コード:35212、基準日:20151120、測定日:20160212 患者コード:35212、基準日:20151120、測定日:20160309 患者コード:35212、基準日:20151120、測定日:20160408 となっての元のデータに一切の変更はなくても「基準日:20151120」の count(*)は4になって消えるのでそもそもSQL的に微妙では?ってことです。 maxせずにBに対して患者コードと基準日の数だけ直接数える等できないのかなあ?って思います。
JuguarSugar

2021/04/23 08:57

@sousukeさん 説明不足でしたが、 基準日と測定日の間に別の基準日が入ることはないため sazi さんの回答で特に問題ありませんでした。
sousuke

2021/04/24 02:35 編集

@JuguarSugar氏 であれば多分大丈夫かな。あとは基準日と測定日の間に基準日が入ることがなく、 基準日1<測定日x<基準日2<測定日yと来た場合 (つまり同一患者コードで次の基準と測定が来た場合)は基準日2以降のcount(*) (同じ測定日のデータの個数と言っている部分)は 倍々に増えていくことは覚えておいたほうがいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問