2014-12-30 78 views
-3

有歷史表中的某些東西一樣SQL服務器:從歷史表中的一行新舊價值

id user vendor  createdtime 
1 sree a   12/29/2014 23:12:21 
1 sree a   12/29/2014 23:13:21 
1 sree b   12/29/2014 23:14:21 
1 jack a   12/29/2014 23:14:21 
1 jack a   12/29/2014 23:11:21 
1 sree a   12/29/2014 23:11:21 

,需要引起類似

id  user  old vendor  new vendor  createdtime 
1  sree      a    12/29/2014 23:12:21 
1  sree  a    a    12/29/2014 23:13:21 
1  sree  a    b    12/29/2014 23:14:21 
1  jack  b    a    12/29/2014 23:14:21 
1  jack  a    a    12/29/2014 23:11:21 
1  sree  a    a    12/29/2014 23:11:21 
+3

這完全不可讀。請編輯您的問題,也許包括一個SQL小提琴演示。 – dario

+1

對不起,這是什麼問題? – Richard

+1

我想他想加入基於id和createdtime的以前的版本? – dotjoe

回答

0

在SQL Server 2012+ ,您可以使用lag()功能:

select h.*, lag(vendor) over (partition by user order by createdtime) as prev_vendor 
from history h; 

在早期版本中,您可以使用子查詢來完成此操作。然而,outer apply更強大:

select h.*, hprev.vendor as prev_vendor 
from history h outer apply 
    (select top 1 h2.* 
     from history h2 
     where h2.vendor = h.vendor 
     order by createdtime 
    ) hprev; 

這使您可以拉出更多的列從此前的紀錄 - 例如,不只是供應商名稱也是createdtime

1
select h.id as id , h.[user] as [user], 
(select top 1 h2.vendor 
     from History h2 
     where h2.[user] = h.[user] and h2.createdtime < h.createdtime 
     order by h2.createdtime desc) as [old vendor], 
    h.vendor as [new vendor] 

    from History h 
    order by h.createdtime