- ベストアンサー
凝ったSQL文なのですが・・・
下記SQLを教えてください。 テーブル構成は(基本的には)変更不可という前提でお願いいたします。 以下のような会員テーブルがあります。 ユーザID毎に、入会日、退会予定日が登録されており、 ユーザID+履歴No.でプライマリとします。 このテーブルは、月に一度、退会手続きのなかった会員に対して、 自動で新規レコード追加します(継続手続)。 ある期間休んだ後、再入会の場合も手動で新規レコード追加されます。 ステータスは有効(1)/無効(0)の判定です。 no user_id start_day end_day status ---------------------------------------- 1 aaa 2002/12/01 2002/12/31 0 2 aaa 2003/01/01 2003/01/31 0 3 bbb 2003/01/01 2003/01/31 0 4 aaa 2003/02/01 2003/02/28 1 5 bbb 2003/02/02 2003/02/28 1 6 ccc 2003/02/01 2003/02/28 1 とデータが入っている場合に、 新規登録ユーザ(No.6)および 再入会ユーザ(No.5)をえらびたいのです。 あるユーザが自動継続かどうかの判定は、 status=1のレコードのend_dayと そのひとつ古いレコードのend_dayが連続していることです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これでどうでしょう。 status=1で、かつ user_idが同じで開始日の前日を終了日に持ったレコードが存在しないもの を検索してみました。 select a.user_id from table a where a.status = '1' and 0 = (select count(*) from table where user_id=a.user_id and end_day=to_char(to_date(a.start_day,'yyyy/mm/dd')-1,'yyyy/mm/dd)');
その他の回答 (2)
- jmh
- ベストアンサー率23% (71/304)
(oracle) select a.* from members a, members b where a.status = 1 and a.user_id = b.user_id(+) and a.start_day - 1 = b.end_day(+) and b.rowid is null -- and a.no > b.no(+) -- and b.status(+) = 0
- anoko
- ベストアンサー率50% (5/10)
select user_id from テーブル a where status = 1 and not exist (select * from テーブル b where b.user_id = a.user_id and b.end_day = a.start_day - 1); こんな感じでいかがでしょうか。 start_day,end_dayはdate型であることが前提です。