这是表结构的简化版本。
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
我不知道如何才能得到这些结果。任何帮助将受到高度赞赏。
答案 0 :(得分: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