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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1028閲覧

SQLの抽出条件について

vestrade

総合スコア9

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/12/09 00:49

前提・実現したいこと

対象条件のSQL文が分からないためご助力いただけますでしょうか。
抽出したい条件は以下です。

・detailsにAAAをもつsubscriptionのstatusがACTIVEなuser
かつ
・detailsにAAAをもつsubscription以外は、全てstatusがCLOSEDである(もしくは存在しない)user

AAAのsubscriptionがACTIVEであっても、そのuserのdetailsがAAAでないACTIVEなsubscriptionを持っている場合は、対象外としたいです。

以下のテーブルの例ですと、user_idが3と6のuserを抽出したいと思っています。

対象のテーブル

テーブル名:subscriptions

idsubscription_iduser_idstatusdetails
111ACTIVEbronze
222ACTIVEAAA
332ACTIVEsilver
443ACTIVEAAA
553CLOSEDsilver
664CLOSEDAAA
775CLOSEDAAA
885ACTIVEgold
995CLOSEDbronze
10106ACTIVEAAA

試したこと

以下SQLを実行しましたが、うまくいきませんでした。

SELECT * FROM subscriptions as s1 INNER JOIN subscriptions as s2 ON s1.user_id not in (s2.user_id) AND s1.status = 'ACTIVE' AND s1.details like 'AAA' AND s2.status = 'ACTIVE' AND s2.details not like 'AAA'
SELECT * FROM subscriptions as s1 INNER JOIN subscriptions as s2 ON s1.user_id <> s2.user_id AND s1.status = 'ACTIVE' AND s1.details like 'AAA' AND s2.status = 'ACTIVE' AND s2.details not like 'AAA'

補足情報(FW/ツールのバージョンなど)

PostgreSQL

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

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

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

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

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

maisumakun

2021/12/09 01:17

> うまくいきませんでした。 それぞれどのような結果が得られたのですか?
yambejp

2021/12/09 01:21 編集

定義があいまい >detailsにAAAをもつsubscriptionのstatusがACTIVEなuser 以下どうとでも取れます (1)特定のレコードのdetailsがAAAかつstatusがACTIVEというデータを持つuser (2)どこかのレコードのdetailsがAAAで、別の(同じでもよい)レコードのstatusがACTIVEを持つuser (3)detailsがAAAレコードを持ち、statusの全てがACTIVEなuser
退会済みユーザー

退会済みユーザー

2021/12/09 01:37

サンプルデータの2と4と10の違い、6と7の違いがわからないので、隠している条件や省いてしまったデータによる絞り込みも必要なのではないでしょうか?
vestrade

2021/12/09 04:51

分かりづらい表現となってしまい申し訳ありません。 ベストアンサーでやりたいことができました。 ありがとうございました。
guest

回答2

0

これはどうでしょうか?

SQL

1select user_id 2from subscriptions 3group by user_id 4having count(case when ("status" = 'ACTIVE' and details='AAA') then id else NULL end) = 1 5and count(case when ("status" = 'ACTIVE' and details!='AAA') then id else NULL end) = 0;

投稿2021/12/09 11:11

skys215

総合スコア910

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

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

0

ベストアンサー

いまいち読み取れんけどこれでいいんかな?
detailsにAAA、statusがACTIVEなユーザーの内、
他のsubscriptionsに、detailsにAAA以外のstatusがCLOSED以外のデータを持っていないもの
言い直してもややこしい…

sql

1select * 2from subscriptions A 3where A.details='AAA' and A.status='ACTIVE' 4 and not exists( 5 select 0 6 from subscriptions B 7 where B.user_id=A.user_id 8 and B.details<>'AAA' 9 and B.status<>'CLOSED' 10 )

投稿2021/12/09 01:28

編集2021/12/09 02:36
sousuke

総合スコア3830

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

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

vestrade

2021/12/09 04:50

意図を読み取ってくださりありがとうございます。 もう少し分かりやすい表現をしたかったのですが、語彙が足りずすみませんでした。
sousuke

2021/12/09 05:35

やりたいことをプログラムに近い日本語に変換することは どんな言語を書くにしても大事な要素なので落ち着いて考えるといいと思います。 例えば where A.details='AAA' and A.status='ACTIVE' で「detailsにAAA、statusがACTIVEな」データがとれますし この時点でサンプルだとidは2,4,10の3行だけになります。 このid:2をさらに(and)消すことになるのですがその条件が 「detailsにAAA以外のstatusがCLOSED以外のデータを持っていないuser_id」となるので not existsのselect文につながります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問