アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記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が連続していることです。
よろしくお願いいたします。

A 回答 (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)');
    • good
    • 0

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型であることが前提です。
    • good
    • 0

(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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!