4

这是表结构的简化版本。

Employee  
(  
    ID          GUID   NOT NULL
    OldID           GUID   NULL
    Name            VARCHAR(50) NOT NULL
    CreationDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)

它包含员工信息以及对员工属性所做的任何更改。这样我们就可以对所做的更改进行完整的审核。当 OldID 为 NULL 时,这基本上意味着最新的数据。这是一个示例,我使用整数值作为标识符以使此示例更易于理解。

ID  OldId       Name        CreationDate  
13  NULL        John        15-July-2013  
12  13      John1       14-July-2013  
11  12      John2       13-July-2013  
10  11      John3       12-July-2013  
121 NULL        Smith       15-July-2013  

首先,我可以通过以下方式从表中获取独特的员工

SELECT ID, Name FROM Employee WHERE OldId IS NULL

我正在寻找最新的 ID,但它的最早名称。所以结果应该是两行

ID     Name  
13     John3  
121    Smith  

我不确定如何获得这些结果。任何帮助将不胜感激。

4

1 回答 1

1

这是一种适用于您的数据的方法:

with groups as
(
  select groupID = ID, *
  from Employee
  where OldID is null
  union all
  select g.groupID, e.*
  from groups g
    inner join Employee e on g.ID = e.OldID
)
, ranks as
(
  select *
    , firstRank = row_number () over (partition by groupID order by creationDate)
  from groups
)
select ID = groupID
  , Name
from ranks
where firstRank = 1

SQL Fiddle 与演示

于 2013-08-22T22:34:40.700 回答