我有一个需要帮助的场景。我对堆栈溢出有点新意,所以如果我在提出问题时犯了任何错误,请告诉我。欢迎您的反馈。
我正在使用SQL Server中的表,其值如下:
OldValue NewValue Date
------------------------------------
1 2 2016-08-01
2 3 2016-08-03
101 102 2016-08-06
102 103 2016-08-08
103 105 2016-08-14
201 202 2016-08-06
202 203 2016-08-08
203 205 2016-08-14
205 209 2016-08-18
我正在尝试提出一个查询,该查询将获取旧的替换为最旧和最新的值。我正在寻找一个看起来像这样的输出。
OldValue NewValue
--------------------------
1 3
101 105
201 209
我提出的问题如下:
select
a.OldCPN, b.NewCPN
from
test..TestTable a
inner join
TestTable b on a.NewCPN = b.OldCPN and a.date <= b.date
通过上面的查询,我得到了在中间级别替换的所有值。但我只需要一行具有最旧的值和最新的值,用它替换它。
非常感谢任何帮助。
谢谢。
答案 0 :(得分:3)
假设值按升序排列;较新的日期作为较大的值
使用递归CTE
; with
cte as
(
-- parent record
select parent = OldValue, OldValue, NewValue, Date
from sample_data d
where not exists
(
select *
from sample_data x
where x.NewValue = d.OldValue
)
union all
-- child
select parent = c.parent, d.OldValue, d.NewValue, d.Date
from cte c
inner join sample_data d on c.NewValue = d.OldValue
)
select parent as OldValue, max(NewValue) as NewValue
from cte
group by parent
编辑:将查询的最后一部分更改为以下处理非升序值
select *
from
(
select parent as OldValue, NewValue, Date, rn = row_number() over (partition by parent order by Date desc)
from cte
) c
where c.rn = 1