0

我有一张关于会员订阅的表格,其中有四个主要列:

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 条件,查询仅选择至少有一个订阅且订阅结束日期 > '01 - JAN - 2012' 的成员,并使用months_between(sysdate,max(subscription_end_Date))>=5它仅返回自上次订阅结束日期起至少 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

像这样的东西应该工作。

select old.member_id
from subscription old left join subscription renew on old.member_id = renew.member_id
and renew.start_date <= old.end_date + 165 -- (roughly 5 months)
where old.end_date >= {d '2012-01-01'} 
and old.end_date < {d '2013-01-01'}
and renew.start_date is null

oracle 可能不喜欢这种日期格式,但这应该是正确的逻辑。

于 2013-06-16T12:53:13.860 回答
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 回答