Sql server 交叉应用-查找最新更改

Sql server 交叉应用-查找最新更改,sql-server,Sql Server,获取: 预期结果: +--------+---------------+-------+---------+---------------+---------------+ | SeqNo | Name | ID | ColName | Start_Value | End_Value | +--------+---------------+-------+---------+---------------+---------------+ | AAA111

获取:

预期结果:

+--------+---------------+-------+---------+---------------+---------------+
| SeqNo  |     Name      |  ID   | ColName |  Start_Value  |   End_Value   |
+--------+---------------+-------+---------+---------------+---------------+
| AAA111 | IronMan       | E8888 | Name    | CaptainMarvel | IronMan       |
| AAA111 | CaptainMarvel | E8888 | Name    | TaeYeon       | CaptainMarvel |
| AAA111 | TaeYeon       | E8888 | Name    | JungKook      | TaeYeon       |
| AAA111 | IronMan       | E8888 | Gender  | L             | P             |
| BBB222 | V             | D2222 | Name    | Jin           | V             |
+--------+---------------+-------+---------+---------------+---------------+
我在这里创建了一些示例:


基于fiddle,它捕获了所有更改,但我只需要找到基于ID和ColName的最新更改。换句话说,如果同一列和同一ID有多个更改,它将捕获最新的更改,如E8888所示

如果我答对了你的问题,你可以使用
行号

+-------+---------------+-------+---------+---------------+---------------+
| SeqNo |     Name      |  ID   | ColName |  From_Value   |   To_Value    |
+-------+---------------+-------+---------+---------------+---------------+
| A123  | IronMan       | E8888 | Name    | CaptainMarvel | IronMan       |
| A123  | IronMan       | E8888 | Gender  | L             | P             |
| B456  | DOTS          | D2222 | Name    | DOTS          | DOTS          |
+-------+---------------+-------+---------+---------------+---------------+

小提琴很好,但你的问题需要措辞合理,以便在没有小提琴的情况下可以理解和回答,这样当链接失效时,这个问题对未来的读者仍然有用。
WITH cte AS (
 SELECT RowNum,ColSeq, q.SeqNo, q.ToName AS Name, q.ID, ca.ColName
       ,ca.Start_Value, ca.End_Value 
       ,ROW_NUMBER() OVER(PARTITION BY ID, ColName ORDER BY Rownum) AS rn
 FROM
 (
  SELECT  a1.ID, a1.SeqNo, a1.NameReason, a1.GenderReason, a1.RowNum, 
   a2.Name as FromName, a1.Name as ToName,
   a2.Gender AS FromGender, a1.Gender AS ToGender
  FROM A a1
  JOIN A a2 ON (a2.ID = a1.ID AND a2.RowNum = a1.RowNum + 1)
  WHERE (a1.NameReason IS NOT NULL OR a1.GenderReason IS NOT NULL)
 ) q
 CROSS APPLY (VALUES 
  (1, 'Name', NameReason, FromName, ToName), 
  (2, 'Gender', GenderReason, FromGender, ToGender)
 ) ca (ColSeq, ColName, Reason, Start_Value, End_Value)
 WHERE ca.Reason IS NOT NULL
)
SELECT SeqNo, Name, ID, ColName, Start_Value, End_Value
FROM cte
WHERE rn = 1
ORDER BY SeqNo, ColSeq;