0

4 つの主要な列を持つメンバーのサブスクリプションに関するテーブルがあります。

1-member_id 
2-subscription_no 
3-subscription_start_date 
4-subscription_end_Date

そして、すべてのメンバー (一意のメンバー ID を持つ) は複数のサブスクリプションを持っている可能性があるため、すべてのメンバーの最新のサブスクリプション日を取得する必要があります。

今私のシナリオは次のようなものです:

2012 年のアクティブなサブスクリプションの 5 か月後に再度サブスクリプションしなかったメンバーを取得する必要があります。

つまり、失われた基準は、2012 年の最後のアクティブなサブスクリプションの終了から 5 か月後にサブスクライブしないことであるため、会社がサブスクライバーとしてそれらを失ったメンバーを知る必要があります。

4

4 に答える 4

1

次の選択を使用できます。

select member_id, max(subscription_end_Date)
from yourTable
where subscription_end_Date>= trunc(trunc(sysdate,'year')-1,'year')
group by member_id having months_between(sysdate,max(subscription_end_Date))>=5; 

trunc(trunc(sysdate,'year')-1,'year') 昨年の最初の日を返します。

trunc 条件を使用することにより、クエリは、subscription_end_Date > '01 - JAN - 2012' のサブスクリプションを少なくとも 1 つ持つメンバーのみを選択し、months_between(sysdate,max(subscription_end_Date))>=5最後の subscription_end_Date から少なくとも 5 か月間サブスクライブしていないメンバーのみを返します。

チッ!

于 2013-06-16T14:38:39.253 に答える
1

シナリオに応じて、次のようにいくつかのテストを行いました

 create table table1 (id integer, nm integer, stdate date, endate date);

いくつかのテストデータを挿入しました

Insert into TABLE1(ID, NM, STDATE, ENDATE)
 Values (1, 2, TO_DATE('04/09/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('06/17/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into TABLE1(ID, NM, STDATE, ENDATE)
 Values(1, 1, TO_DATE('03/25/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('06/14/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into TABLE1(ID, NM, STDATE, ENDATE)
 Values(2, 3, TO_DATE('03/05/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('06/15/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into TABLE1(ID, NM, STDATE, ENDATE)
 Values(2, 2, TO_DATE('03/06/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('06/28/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
COMMIT;

そしてクエリは

with q1 as (
  select id, nm, stdate, endate,
    row_number() over (partition by id order by endate desc) as rn 
  from table1
) select * from q1 where rn=1
and <last5 months criteria using endate>;

クエリの結果

select id, nm, stdate, endate,
    row_number() over (partition by id order by endate desc) as rn 
  from table1

次の結果が得られたら、rn 列と過去 5 か月の条件を使用して結果をフィルター処理できます。

id  nm  sdate       endate      rn
1   2   09.04.2013  17.06.2013  1
1   1   25.03.2013  14.06.2013  2
2   2   06.03.2013  28.06.2013  1
2   3   05.03.2013  15.06.2013  2
于 2013-06-17T06:04:50.787 に答える
0

これはあなたの仕事をするはずです[今年5か月が経過したため、クエリが実行されると仮定すると]、全体のロジックは、最大サブスクリプションの終了日が2012年にあるということです:

select member_id from (
select member_id, max(subscription_end_Date) ed, max(subscription_start_Date) sd
  from yourTable
group by member_id) a
where trunc(ed, 'YEAR') = 2012 and sd <= add_months(ed,5)
于 2013-06-16T14:12:41.537 に答える