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

时间:2016-08-29 00:06:05

标签: sql sql-server teradata hierarchy

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

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

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

非常感谢任何帮助。

谢谢。

1 个答案:

答案 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