我有一个关于成员订阅的表,它有四个主要栏目:
1-member_id
2-subscription_no
3-subscription_start_date
4-subscription_end_Date
每个成员(具有唯一的成员ID)可能有多个订阅,因此我需要为每个成员获取最新的订阅日期。
现在我的情况是这样的:
我需要让在2012年有效订阅5个月后没有再订阅的会员。
I。我需要知道公司已经失去他们作为订阅者的成员作为丢失的标准在2012年他最后一次有效订阅结束后的5个月内没有订阅。
答案 0 :(得分: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'并使用months_between(sysdate,max(subscription_end_Date))>=5
它只返回那些从最后一个subscription_end_Date开始至少已订阅5个月的人。
HTH!
答案 1 :(得分:1)
我根据你的schenario做了一些测试
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
答案 2 :(得分: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可能不喜欢那种日期格式,但这应该是正确的逻辑。
答案 3 :(得分: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)