如何在 SQL 查询中获取父值和最后替换的值
How to get parent value and last replaced value in SQL query
我有一个场景需要帮助。我是堆栈溢出的新手,所以如果我在提问时犯了任何错误,请告诉我。欢迎您的反馈。
我正在 SQL 服务器中使用 table,其中值如下:
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
通过上述查询,我也获得了在中间级别替换的所有值。但我只需要一行具有最旧值和最新值的行。
非常感谢任何帮助。
谢谢。
假设值按升序排列;值越大越新的日期
使用递归 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
我有一个场景需要帮助。我是堆栈溢出的新手,所以如果我在提问时犯了任何错误,请告诉我。欢迎您的反馈。
我正在 SQL 服务器中使用 table,其中值如下:
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
通过上述查询,我也获得了在中间级别替换的所有值。但我只需要一行具有最旧值和最新值的行。
非常感谢任何帮助。
谢谢。
假设值按升序排列;值越大越新的日期
使用递归 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