2013-08-22 18 views
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 

我不知道如何得到這些結果。任何幫助將不勝感激。

+2

好吧,+1可能是今天第一個在日期/時間列中存儲日期/時間值的人。 –

+1

OldID的示例值看起來像新記錄的ID ... – vasja

+0

如果我在示例中使用了guid,它會有點棘手,看到這些鏈接,這就是爲什麼我在發佈時提到它「我正在使用整數值作爲標識符讓這個例子更容易理解。「 –

回答

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