Dynamically select distinct current and previous columns from a sql table

后端 未结 2 1038
盖世英雄少女心
盖世英雄少女心 2021-01-14 12:00

I have a temporary table like so

   Id  |Name    |Status |   Rate |  Method  |ModifiedTime             |ModifiedBy
------------------------------------------         


        
2条回答
  •  误落风尘
    2021-01-14 12:37

    Assuming NAME (Recipe1) is a key

    Declare @Table table (Id int,Name varchar(50),Status int,Rate int,Method varchar(50),ModifiedTime DateTime,ModifiedBy varchar(50))
    Insert Into @Table values
    (1,'Recipe1',0,30,'xyz','2016-07-26 14:55:57.977','A'),
    (2,'Recipe1',0,30,'abc','2016-07-26 14:56:18.123','A'),
    (3,'Recipe1',1,30,'xyz','2016-07-26 14:57:50.180','b')
    
    Declare @XML xml
    Set @XML = (Select * from @Table for XML RAW)
    
    ;with cteBase as (
        Select ID           = r.value('@Id','int') 
              ,Name         = r.value('@Name','varchar(150)')
              ,ModifiedTime = r.value('@ModifiedTime','varchar(150)')
              ,ModifiedBy   = r.value('@ModifiedBy','varchar(150)')
              ,Item         = Attr.value('local-name(.)','varchar(max)')
              ,Value        = Attr.value('.','varchar(max)')
        From  @XML.nodes('/row') AS A(r)
        Cross Apply A.r.nodes('./@*[local-name(.)!="Id"]') AS B(Attr)
    )
    ,cteExt as (Select *,LastValue =Lag(Value) over (Partition By Name,Item Order by ModifiedTime) From cteBase)
    Select Name
          ,Item
          ,Before=LastValue
          ,After =Value
          ,ModifiedTime
          ,ModifiedBy
     From  cteExt 
     Where Value<>LastValue and LastValue is not null
       and Item not in ('ModifiedTime','ModifiedBy')
     Order By Name,ModifiedTime
    

    Returns

    Name    Item    Before  After   ModifiedTime            ModifiedBy
    Recipe1 Method  xyz     abc     2016-07-26T14:56:18.123 A
    Recipe1 Method  abc     xyz     2016-07-26T14:57:50.180 b
    Recipe1 Status  0       1       2016-07-26T14:57:50.180 b
    

提交回复
热议问题