2017-04-13 109 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 )