2012-06-20 104 views
5

我想根據日期字段查找最近的記錄。當我在where子句中設置latest = 1時,出現錯誤。如果可能的話請幫忙。 DATE是我正在排序的字段。我曾經嘗試都最新= 1,最新= '1'Oracle選擇最近的日期記錄

SELECT 
STAFF_ID, 
SITE_ID, 
PAY_LEVEL, 
ROW_NUMBER() OVER (PARTITION BY STAFF_ID ORDER BY DATE DESC) latest 

FROM OWNER.TABLE 
WHERE END_ENROLLMENT_DATE is null 
AND latest = 1 
+0

任何的替代品? – user1440675

+0

...你可能不想要最新的記錄,但最新的記錄:日期<= SYSDATE(避免未來的日期記錄,比如計劃下個月的工資增長...) – Glenn

回答

11

你不能使用從選擇列表別名WHERE子句中

也不能使用裏面OVER子句WHERE子句(因爲Order of Evaluation SELECT語句的) - 「你可以用該子句指定解析函數在選擇列表或ORDER BY子句中。「 (引自docs.oracle.com

select * 
from (select 
    staff_id, site_id, pay_level, date, 
    max(date) over (partition by staff_id) max_date 
    from owner.table 
    where end_enrollment_date is null 
) 
where date = max_date 
0

我想我會用MAX這樣的嘗試:

SELECT staff_id, max(date) from owner.table group by staff_id 

然後鏈接在你的其他列:

select staff_id, site_id, pay_level, latest 
from owner.table, 
( SELECT staff_id, max(date) latest from owner.table group by staff_id) m 
where m.staff_id = staff_id 
and m.latest = date 
0

假設staff_id +日期形成英國,這是另一種方法:

SELECT STAFF_ID, SITE_ID, PAY_LEVEL 
    FROM TABLE t 
    WHERE END_ENROLLMENT_DATE is null 
    AND DATE = (SELECT MAX(DATE) 
        FROM TABLE 
        WHERE staff_id = t.staff_id 
        AND DATE <= SYSDATE) 
0
select * 
from (select 
    staff_id, site_id, pay_level, date, 
    rank() over (partition by staff_id order by date desc) r 
    from owner.table 
    where end_enrollment_date is null 
) 
where r = 1 
+2

請評論代碼。 – lpapp