无法为此方案创建查询

时间:2013-08-22 20:31:48

标签: sql-server-2008 tsql

这是表结构的简化版本。

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  

我不知道如何才能得到这些结果。任何帮助将受到高度赞赏。

1 个答案:

答案 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

SQL Fiddle with demo