2012-06-20 26 views
5

Estoy tratando de encontrar el registro más reciente basado en un campo de fecha. Cuando configuro latest = 1 en la cláusula where, obtengo un error. Por favor ayuda si es posible. FECHA es el campo por el que estoy ordenando. He intentado tanto últimas = 1 y noticias = '1'Oracle selecciona el registro de fecha más reciente

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

alguna alternativa? – user1440675

+0

... y probablemente no desee el último registro, pero el último registro: date <= SYSDATE (evite los registros futuros, por ejemplo, para el aumento salarial previsto el próximo mes ...) – Glenn

Respuesta

11

no se puede utilizar alias de lista de selección dentro de la cláusula WHERE (debido a la Order of Evaluation de una instrucción SELECT)

también no se puede utilizar OVER cláusula dentro cláusula WHERE - "Puede especificar las funciones analíticas de esta cláusula en la lista de selección o en la cláusula ORDER BY ". (Cita de 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

creo que me gustaría probar con MAX algo como esto:

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

luego enlazar en sus otras columnas:

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

Suponiendo fecha staff_id + formar un uk, este es otro método:

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

Comente el código. – lpapp

Cuestiones relacionadas