如何在 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