2014-12-04 290 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