【发布时间】:2019-03-11 11:36:41
【问题描述】:
原数据
+--------+-------+---------------+------------+--------+--------------+-------+
| RowNum | SeqNo | Name | NameReason | Gender | GenderReason | ID |
+--------+-------+---------------+------------+--------+--------------+-------+
| 1 | A123 | IronMan | | P | | E8888 |
| 2 | A123 | CaptainMarvel | A | L | A | E8888 |
| 3 | A123 | Yoooo | | | | E8888 |
| 4 | A123 | Heyyy | | | | E8888 |
| 1 | B456 | Hey | | | | D2222 |
| 2 | B456 | DOTS | A | | | D2222 |
| 1 | C1234 | Hulk | | | | E8989 |
| 2 | C1234 | Cap | | | | E8989 |
| 3 | C1234 | Hat | | | | E8989 |
+--------+-------+---------------+------------+--------+--------------+-------+
我想要的结果
+-------+-------+---------+---------------+----------+--------+
| SeqNo | ID | ColName | From_Value | To_Value | Reason |
+-------+-------+---------+---------------+----------+--------+
| A123 | E8888 | Name | CaptainMarvel | IronMan | A |
| A123 | E8888 | Gender | L | P | A |
| B456 | D2222 | Name | DOTS | Hey | A |
| C1234 | E8989 | Name | Cap | Hulk | |
+-------+-------+---------+---------------+----------+--------+
查询:
select a.rownum, a.seqno, a.name, a.id,
b.*
from #A a cross apply
( values ('Name', NameReason)
('Gender', GenderReason)
) b (colname, Reason)
where reason is not null
注意:要查找更改。 RowNum=1 是最新更新 (To_Value),RowNum=2 (From_Value)。 Rownum 已经过滤了顶部更新的结果 (rownumber () over (partitition) 。 我只需要 rownum=2(from_Value), rownum=1(to_value) 其他人忽略, 因为 1 个应用程序可以更新 100 次,我只需要找到最新的更改即可。
从上面的查询中,如何修改为我想要的结果?如何添加from_value和to_value,原因?
【问题讨论】:
-
请解释一下转换的逻辑。不明显。
-
@GordonLinoff 嗨。我只是想知道有什么变化。 RowNum=1 绝对是最新的更新。我想要的结果,From_Value=RowNum=2,To_Value=RowNum=1。我只想知道如何修改我的脚本以便满足 From_Value 和 To_Value
标签: sql sql-server cross-apply