根据日期范围获取记录

时间:2014-12-04 21:19:19

标签: oracle

我有不同日期的会员注册信息表。我需要一个查询来查找会员信息。

给定日期,它将检查用户是否在该日期注册

  • 如果是,则返回该日期

  • 如果没有,则返回最新的注册行。

结果中有一个额外的状态列,显示成员是否已注册或截至今天。我正在使用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

1 个答案:

答案 0 :(得分: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