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