2012-06-20 45 views
5

Tôi đang cố gắng tìm bản ghi gần đây nhất dựa trên trường ngày. Khi tôi đặt mới nhất = 1 trong mệnh đề where, tôi gặp lỗi. Xin hãy giúp đỡ nếu có thể. DATE là trường tôi sắp xếp theo. Tôi đã thử cả = mới nhất 1 và mới nhất = '1'Oracle chọn bản ghi ngày gần đây nhất

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

Bất kỳ lựa chọn thay thế? – user1440675

+0

... và bạn có thể không muốn bản ghi mới nhất, nhưng bản ghi mới nhất: ngày <= SYSDATE (tránh các bản ghi ngày trong tương lai, cho biết tăng lương theo kế hoạch vào tháng tới ...) – Glenn

Trả lời

11

bạn không thể sử dụng bí danh từ danh sách lựa chọn bên trong mệnh đề WHERE (vì Order of Evaluation của một câu lệnh SELECT)

bạn cũng không thể sử dụng OVER khoản bên trong mệnh đề WHERE - "Bạn có thể chỉ định các chức năng phân tích quy định tại khoản này trong danh sách chọn hoặc mệnh đề ORDER BY. " (Trích dẫn từ 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

tôi nghĩ rằng tôi muốn thử với MAX một cái gì đó như thế này:

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

sau đó liên kết trong các cột khác của bạn:

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

Giả sử staff_id + ngày tạo thành uk, đây là một phương pháp khác:

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

Vui lòng nhận xét mã. – lpapp

Các vấn đề liên quan