gpt4 book ai didi

sql - 如何在 SQL 查询中获取父值和最后替换的值

转载 作者:行者123 更新时间:2023-12-01 13:42:06 24 4
gpt4 key购买 nike

我有一个场景需要帮助。我是堆栈溢出的新手,所以如果我在提问时犯了任何错误,请告诉我。欢迎您的反馈。

我正在使用 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

通过上述查询,我​​也获得了在中间级别替换的所有值。但我只需要一行具有最旧的值和替换它的最新值。

非常感谢任何帮助。

谢谢。

最佳答案

假设值按升序排列;值越大越新

使用递归 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 - 如何在 SQL 查询中获取父值和最后替换的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com