如何做Oracle日期排名?

时间:2013-06-16 12:32:08

标签: sql plsql oracle10g

我有一个关于成员订阅的表,它有四个主要栏目:

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

每个成员(具有唯一的成员ID)可能有多个订阅,因此我需要为每个成员获取最新的订阅日期。

现在我的情况是这样的:

我需要让在2012年有效订阅5个月后没有再订阅的会员。

I。我需要知道公司已经失去他们作为订阅者的成员作为丢失的标准在2012年他最后一次有效订阅结束后的5个月内没有订阅。

4 个答案:

答案 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)