2017-04-13 213 views
1

我正在處理此表,如下所示,它包含名稱,日期,ID和密鑰。我想插入到新表中old_name列保持該密鑰的名稱更改。輸出結果如下所示。由於將歷史記錄插入新表

  id  name  date     Key 
      1  charles  2004-05-07    1001 
      2  CON   2004-05-07    1001 
      3  Virginia 2006-09-08    1001 
      4  MART  2012-01-03    1001 
      5  McDonalds 2013-12-30    1001 


    OUTPUT 

      id old_name   name  date     Key 
      1  NULL    charles  2004-05-07   1001 
      2  charles   CON   2004-05-07   1001 
      3  CON    Virginia 2006-09-08   1001 
      4  Virginia   MART  2012-01-03   1001 
      5  MART    McDonalds 2013-12-30   1001 
+0

許多方法:SQL Se rver 2016提供時間表,可以自動跟蹤歷史變化。在以前的版本中,您可以使用更改跟蹤來檢測更改。您可以使用觸發器,每次更改行時將記錄插入歷史記錄表 –

+0

感謝您的評論。我應該更具體。我不想使用觸發器。我有一個表,我只需要跟蹤這些更改並將其插入到一個新表中。 –

回答

1

似乎是一個非常適合LAG()

Select id 
     ,old_name = lag(name,1) over (Partition By [Key] Order by ID) 
     ,name 
     ,date 
     ,[key] 
From YourTable 
Order By ID 
+0

感謝約翰爲您的及時迴應。它工作得很好。瞭解滯後函數是很好的。大。 –

+0

@data_weed 3件事。 1)它感到高興。 2)很酷的名字。 3)值得您花時間去熟悉窗口函數() –

+0

像lag()這樣的窗口函數非常方便,但不要忘記,它們中的大多數僅在SQL2012 +中可用。閱讀Ben-Gan先生的一些內容並不會讓人感到痛苦:http://sqlmag.com/sql-server-2012/how-use-microsoft-sql-server-2012s-window-functions-part-1。 – Shawn

0

您可以使用滯後,如果它是SQL服務器> = 2012

select *, lag(name,1,null) over(order by id) Old_name from #yourhistory 

你輸入表

create table #yourhistory (id int, name varchar(20), date date, [key] int) 

insert into #yourhistory 
    (id ,  name ,  date    ,  [Key]) values 
    ( 1 ,'charles ','2004-05-07',    1001 ) 
    ,( 2 ,'CON  ','2004-05-07',    1001 ) 
    ,( 3 ,'Virginia ','2006-09-08',    1001 ) 
    ,( 4 ,'MART  ','2012-01-03',    1001 ) 
    ,( 5 ,'McDonalds','2013-12-30',    1001 )