2014-12-04 194 views
0

我在不同日期有成员注册信息表。我需要一个查询来查找成员信息。根据日期范围获取记录

鉴于它会检查的日期,如果用户在该日期登记或不

  • 如果是它返回日期

  • ,如果没有它返回最新招生一行。

结果中有一个额外的状态栏,显示成员是否注册或者截至今天。我正在使用CASE语句来计算它。

在这里,我有一个查询,我迄今为每个成员显示最新。我需要帮助来修改/合作,以便它也能回到我的真实状态。

select * 
from (
    select id, member_id, enroll_date, end_date, 
    CASE 
     WHEN sysdate between enroll_date and end_date THEN 'Active' 
     ELSE 'Inactive' 
    END 
    Status, 
    row_number() over (partition by member_id order by enroll_date desc) rn 
    from myView 
)where rn = 1 

表结构

ID MEMBER_ID ENROLL_DATE END_DATE 
01 123456789 01-JAN-13  31-DEC-13 
02 123456789 01-JAN-06  31-DEC-06 
03 123456789 01-JAN-11  31-DEC-11 
04 987654321 01-JAN-08  31-DEC-12 
05 987654321 01-FEB-13  31-DEC-99 
06 987654321 01-JAN-13  31-JAN-13 

我想基于输入日期成员的信息和状态。

例如

a)如果输入的日期是2005/1/1那么就应该给我01和05

01 123456789 01-JAN-13  31-DEC-13  Inactive 
05 987654321 01-FEB-13  31-DEC-99  Active 

b)若输入的是2006年1月1日,那么它应该给我02和05

02 123456789 01-JAN-06  31-DEC-06  Inactive 
05 987654321 01-FEB-13  31-DEC-99  Active 

c)若输入为2013年1月1日,那么它应该给我01和06

01 123456789 01-JAN-13  31-DEC-13  Inactive 
06 987654321 01-JAN-13  31-JAN-13  Inactive 

d)如果输入是2014年1月1日,那么它应该给我01和05

01 123456789 01-JAN-13  31-DEC-13  Inactive 
05 987654321 01-FEB-13  31-DEC-99  Active 
+0

不明白你的日期。 99 1999或2099? – 2014-12-04 21:35:09

回答

1
select * 
from (
    select id, member_id, enroll_date, end_date, 
    CASE 
     WHEN sysdate between enroll_date and end_date THEN 'Active' 
     ELSE 'Inactive' 
    END 
    Status, 
    row_number() over (partition by member_id 
         order by case when :input_date between enroll_date and end_date 
           then 1 else 2 end, enroll_date desc) rn 
    from myView 
)where rn = 1 

这是一个棘手的秩序,它可以让你分配RN = 1,符合该给定的行日期。否则,最大登记日期行分配RN = 1

order by case when :input_date between enroll_date and end_date 
     then 1 else 2 end, enroll_date desc 
+0

输入日期参数​​在哪里? – 2014-12-04 21:40:26

+0

@anjibman这是系统日期 – Multisync 2014-12-04 21:41:26

+0

@anjibman我已更新我的答案,现在是:input_date – Multisync 2014-12-04 21:42:13