2012-06-20 24 views
5

Ich versuche, den neuesten Datensatz basierend auf einem Datumsfeld zu finden. Wenn ich in der where-Klausel next = 1 setze, erhalte ich einen Fehler. Bitte helfen Sie wenn möglich. DATE ist ein Feld, nach dem ich sortiere. Ich habe beide neuesten = versucht 1 und neueste = '1'Oracle letzten Datensatz auswählen

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

Alternativen? – user1440675

+0

... und Sie wahrscheinlich nicht die neueste Aufzeichnung, aber die neueste Aufzeichnung: Datum <= SYSDATE (vermeiden Sie zukünftige datierte Aufzeichnungen, sagen Sie für die geplante Gehaltserhöhung nächsten Monat ...) – Glenn

Antwort

11

Sie können keine Aliase aus der Auswahlliste in der WHERE-Klausel (wegen der Order of Evaluation einer SELECT-Anweisung) verwenden

auch OVER Klausel in dir nicht WHERE-Klausel verwenden können - „Sie analytische Funktionen mit dieser Klausel angeben in der Auswahlliste oder ORDER BY-Klausel. " (Zitat aus 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

Ich glaube, ich mit MAX so etwas wie dies versuchen würde:

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

dann Link in Ihrem anderen Spalten:

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

Angenommen staff_id + Datum eine uk bilden, ist dies ein weiteres Verfahren:

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

Bitte kommentieren Sie den Code. – lpapp

Verwandte Themen