Tengo un empleado y employee_history tabla. Para cada actualización en la tabla de empleados, me insertar un registro en la employee_history tabla.

Tanto las tablas tienen una columna denominada como la fecha de vigencia que indica que el estatuto de los trabajadores como en que fecha efectiva.

A continuación son mis dos tablas.

Cómo escribir una consulta para obtener el último registro de empleado dada la fecha de vigencia en oracle?

Necesito para obtener el registro de empleado a más tardar en esa fecha efectiva.

e.g Si me necesitan para hacer que el empleado como el 16 de mayo debo el emp_hist_id = 2 registro de la historia de la tabla. Como el 5 de junio debo el emp_hist_id = 4 de hist de la tabla.

Y como el 15 de agosto, me debe obtener el registro de empleado de la tabla en sí.

Ayuda por favor.

  • ¿Por qué no almacenar el actual registro de empleado en employee_history demasiado? A continuación, sólo se necesita para la consulta de employee_history para obtener datos para cualquier fecha.

3 Comentarios

  1. 3

    Usted podría intentar algo como

    SELECT * FROM (
      SELECT * FROM (
        (SELECT emp_id, name, email, title, region, division, "effective date" 
         FROM employee
         WHERE emp_id = desired_id)
        UNION
        (SELECT emp_id, name, email, title, region, division, "effective date" 
         FROM employee _history
         WHERE emp_id = desired_id)
      ) t
      WHERE t."effective date" <= desired_date
      ORDER by t."effective date" DESC) p
    WHERE ROWNUM = 1

    La idea es llevar los registros relacionados con el usuario deseado de ambas tablas, a continuación, tomar las fechas inferior al deseado y finalmente coger el primer

    • Creo que usted necesita para reemplazar el [ ] con " " (suponiendo que el nombre de la columna es "effective date" y no effective_date
    • ops, tienes razón. Gracias!
    • Gracias por la respuesta. Lo que si necesito la lista de todos los empleados y no solo a uno de los empleados con su estatus en la fecha efectiva?
    • Parece que con base en su Consulta de que si se quita el «WHERE ROWNUM = 1» a continuación, se mostrará todas las filas dando todos los empleados. No estoy seguro pero prueba que fuera.
    • He probado la eliminación de «WHERE ROWNUM = 1» y, a continuación, da varias entradas para un empleado. Creo que debemos grupo por empleado id order by fecha de vigencia desc y, a continuación, tome la parte superior de la fila de cada grupo.
    • Intenta hacer lo que usted dijo, si eso no funciona haciendo un SELECT DISTINCT en la emp_id debe limitar los resultados a 1 entrada por empleado, pero todavía permiten que varios empleados para mostrar.

  2. 1

    Este problema se puede solucionar sin funciones analíticas. La subconsulta aquí calcula la más reciente fecha de vigencia en la historia antes de que el empleado fecha de vigencia:

    select e.*
    from employee_history eh join
         (select e.employee_id, max(eh.effective_date) as latest_effective_date
          from employee e join
               employee_history eh
               on e.employee_id = eh.employee_id and
                  e.effective_date >= eh.effective_date
         ) ehl
         on eh.employee_id = ehl.employee_id and
            eh.effective_date = ehl.effective_date

    Esta solución supone que no hay duplicados de las fechas de vigencia en la historia de la tabla. Si hay, entonces usted tiene otra opción. Suponiendo que el employee_history_ids se asignan secuencialmente, tomar el máximo de la id en lugar de la fecha.

    Hay formulaciones alternativas de la solución utilizando Oracle funciones analíticas.

  3. 0

    Tratar el siguiente :

    SELECT *
    FROM
      (SELECT e.emp_id,
              e.name,
              e.email,
              e.title,
              e.region,
              e.division,
              e.effective_date,
              row_number() over (partition BY e.emp_id
                                 ORDER BY e.effective_date DESC) rn
       FROM employee e
       UNION ALL 
       SELECT eh.emp_id,
              eh.name,
              eh.email,
              eh.title,
              eh.region,
              eh.division,
              eh.effective_date,
              row_number() over (partition BY eh.emp_id
                                 ORDER BY eh.effective_date DESC) rn
       FROM employee_history eh)
    WHERE effective_date < to_date('15/06/2012','DD/MM/YYYY')
      AND rn = 1

    se puede ver un ejemplo mejor aquí

Dejar respuesta

Please enter your comment!
Please enter your name here