2014-12-04 59 views
0

我有一些像這樣的記錄的表:挑選最新記錄在甲骨文

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 

現在,如果我給一些日期(例如2014年12月1日),它應該返回我最新的登記日期(即01和05)與狀態。所以輸出像:

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

我有SQL計算狀態,但不能只有一個記錄。我怎麼弄到的?

select id, member_id, enroll_date, end_date, 
    case 
    when TO_DATE(:dateOfCall, 'MM/DD/YYYY') between enroll_date and end_date then 'Active' 
    else 'Inactive' 
    end 
    Status 
from myView; 
+0

最新的日期總是在最後? – 2014-12-04 19:35:43

+0

因此,如果提供的日期恰好是2/28/06 ...你想要ID 02還是想要01?我認爲如果在提供數據時沒有找到記錄,那麼您需要maximum enroll_date和end_date,否則您希望記錄的日期在所提供的日期之間。 – xQbert 2014-12-04 19:37:22

+0

@ xQbert - 如果在範圍內給定日期,那麼返回該記錄,否則返回max enroll_date。 – 2014-12-04 19:47:08

回答

1

您可以使用row_number - 是這樣的:

with cte as (
    select id, member_id, enroll_date, end_date, 
     row_number() over (partition by member_id order by enroll_date desc) rn 
    from myView 
    where enroll_date <= to_date('2014/12/01','yyyy/mm/dd') 
) 
select * 
from cte 
where rn = 1 

這假設你想組的每個結果由member_id。如果不需要,請刪除partition by子句。

+0

這認爲enroll_date小於givn日期,但它應該可以在任何範圍內。我編輯了原文,解釋更多細節。 – 2014-12-04 20:04:45

+0

@anjibman - 我不確定我是否理解你的問題?這將返回最大的enroll_date小於提供的日期(即使提供的日期大於登記日期。 – sgeddes 2014-12-04 20:10:55

+0

我只是更新了[SQL小提琴](http://sqlfiddle.com/#!4/0d5e1/1)它返回記錄3和4不是1和5. – 2014-12-04 20:23:24