Как получить последнюю запись сотрудника в оракуле?

У меня есть таблица сотрудников со столбцами, такими как emp_id, имя, фамилия, region_id, статус и дата_действия.

Employee Table может иметь несколько записей для одного сотрудника с разными датами вступления в силу и статусами.

Employee может иметь два статуса «Leaver» и «Joiner».

id     emp_id    firstname     region    status     effective_date  
1       1         James        Asia      Joiner     1-Jan-2012 
2       1         James        UK        Leaver     1-Aug-2012
3       1         James        USA       Joiner     1-Aug-2012
4       1         James        Asia      Leaver     1-May-2012
5       1         James        UK        Joiner     1-May-2012
6       1         James        USA       Leaver     1-Sep-2012

С указанными выше данными в таблице сотрудников, если я хочу получить самую последнюю запись о Джеймсе по состоянию на 1 января 2012 года, я получу запись с id = 1,

Если бы я хотел получить самую последнюю запись о Джеймсе, как 1 мая 2012 года, я бы получил запись с id = 5

Если бы я хотел получить самую последнюю запись о Джеймсе по состоянию на 1 августа 2012 года, я бы получил запись с id = 3,

Если бы я хотел получить самую последнюю запись о Джеймсе, как 1 сентября 2012 года, я бы получил запись с id = 6

Следующий запрос правильно дает мне последнюю запись

SELECT 
        emp_id, 
        MAX(effective_date) AS latest_effective_date
FROM 
        EMPLOYEE
GROUP BY 
        emp_id

Но тогда как мне получить другие столбцы, такие как имя, регион и т. Д.

Если я помещу их в предложение выбора или группу по предложению, я получу не только последнюю запись, но и другие записи.

 ashishjmeshram28 мая 2012 г., 16:43
@ Sebas. Конечно, 1 августа 2012 года Джеймс переезжает из региона Великобритания в США. Итак, если мне нужно узнать, где находится Джеймс, как 1 августа 2012 года, он должен вернуть США, а не Великобританию. Отсюда запись с id = 3, а не id = 2.
 Sebas28 мая 2012 г., 16:45
Хорошо, тогда вся ваша логика должна быть пересмотрена, ваш собственный запрос возвращает «правильно последнюю запись» только случайно. Я не в этой теме, у вас есть аналитические проблемы, которые нужно решить.
 Sebas28 мая 2012 г., 16:39
Не могли бы вы объяснить это, пожалуйста? «Если я хочу получить самую последнюю запись о Джеймсе, как 1 августа 2012 года, я бы получил запись с id = 3», почему бы не 2?

Ответы на вопрос(5)

необходимо внутренне объединить уже полученный запрос с таблицей Employee:

SELECT  Emp.*
FROM    Employee Emp
        INNER JOIN
        (   SELECT  Emp_ID, MAX(effective_date) AS latest_effective_date
            FROM    Employee
            GROUP BY Emp_ID
        ) MaxEmp
            ON Emp.Emp_ID = MaxEmp.Emp_ID
            AND Emp.Effective_Date = MaxEmp.latest_effective_date
 ashishjmeshram28 мая 2012 г., 16:30
Нет, не работает.
 GarethD28 мая 2012 г., 16:33
Я не могу предложить улучшение / исправление на основе этого отзыва. Почему не работает, не работает? Это работает, но не с результатами, которые вы ожидали?

Попробуй эт

SELECT  
  MAX(id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) id,
  MAX(emp_id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) emp_id,
  MAX(firstname) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) firstname,
  MAX(status) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) status,
  MAX(effective_date) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) effective_date
FROM Employee GROUP BY firstname
SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC) r
FROM  
    EMPLOYEE  e)
WHERE r = 1;

отдельного emp_id.

Ваше второе требование возврата записи за данную дату должно быть выполнено по этому запросу:

(«статус ASC» - позаботится о переходе в статус «Столяр», если на ту же дату есть и «Leaver»).

 SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC, status ASC) r
FROM  
    EMPLOYEE  e
WHERE effective_date <= '<your desired date>')
WHERE r=1;

ами 3, 5, 6, как вы указали ранее, потому что в этом случае:

2       1         James        Asia      Leaver     1-May-2012
3       1         James        UK        Joiner     1-May-2012

effective_date одинаково для обеих строк и, вероятно, вернет запись с идентификатором 2, а не 3.

try добавляя время к вашей таблице или добавляя время к вашему столбцуffective_date, таким образом вы сможете получить последний результат от пользователя в определенную дату.

пытаться

SELECT *
FROM EMPLOYEE emp
INNER JOIN (SELECT max(id) AS id
        emp_id, 
        MAX(effective_date) AS latest_effective_date
FROM 
        EMPLOYEE
GROUP BY 
        emp_id) AS employee_1 on emp.id = employee_1.id
 ashishjmeshram28 мая 2012 г., 16:25
Ids не могут быть сгенерированы в последовательности. Пользователи могут ввести запись за 1 сентября 2012 года в систему, прежде чем вставить запись за 1 августа 2012 года (т.е. прогнозирование).

Ваш ответ на вопрос