Sql Server Найти следующую самую последнюю измененную запись - PullRequest
0 голосов
/ 27 января 2011

В своей таблице истории сотрудников я пытаюсь найти, какая была зарплата, а затем на какую она была изменена. Каждое изменение зарплаты добавляет новую запись, потому что новая зарплата считается новой «работой», поэтому к ней прикрепляются дата начала и окончания. Я могу выбрать все эти даты, но получаю дубликаты, потому что не могу сравнить текущую запись только с самой последней предыдущей записью для этого сотрудника. (если это имеет смысл)

Я бы хотел, чтобы результаты были такими:

Employe Name, OldSalary, NewSalary, ChangeDate(EndDate)
Joe           40,000     42,000     01/10/2011

Пример данных выглядит как

EmployeeHistId     EmpId     Name    Salary      StartDate     EndDate
1                  45        Joe     40,000.00   01/05/2011    01/10/2011
2                  45        Joe     42,000.00   01/11/2011    NULL
3                  46        Bob     20,000.00   01/12/2011    NULL

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Швейцарская армия ROW_NUMBER () на помощь:

with cte as (
select EmployeeHistId     
  , EmpId     
  , Name    
  , Salary      
  , StartDate     
  , EndDate
  , row_number () over (
      partition by EmpId order by StartDate desc) as StartDateRank
from EmployeeHist)
select n.EmpId
  , n.Name
  , o.Salary as OldDalary
  , n.Salary as NewSalary
  , o.EndData as ChangeDate
from cte n
join cte o on o.EmpId = n.EmpId 
  and n.StartDateRank = 1
  and o.StartDateRank = 2;

Используйте внешнее объединение, чтобы получить сотрудников, которые тоже никогда не получали повышение.

Запросы такого типа всегда сложны из-за проблем с чистотой данных, например, если перекрываются StartDate и EndDate.

1 голос
/ 27 января 2011

Вы можете использовать оператор коррелированного соединения APPLY , который может легко решить эти задачи

select a.name, curr.salary, prev.salary, prev.enddate
from employee e
cross apply ( -- to get the current
   select top(1) *
   from emphist h
   where e.empid = h.empid  -- related to the employee
   order by startdate desc) curr
outer apply ( -- to get the prior, if any
   select top(1) *
   from emphist h
   where e.empid = h.empid  -- related to the employee
     and h.EmployeeHistId <> curr.EmployeeHistId -- prevent curr=prev
   order by enddate desc) prev  -- last ended
1 голос
/ 27 января 2011

Я предполагаю, что StartDate и EndDate будут одинаковыми для нового задания и предыдущего задания. Если это так, попробуйте это.

SELECT a.Name AS EmployeeName, b.Salary AS NewSalary a.Salary AS NewSalary, a.StartDate AS ChangeDate
  FROM EMPLOYEE A, EMPLOYEE B
 WHERE a.EmpID = b.EmpID
   AND a.EndDate IS NULL
   AND a.StartDate = b.EndDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...