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;