【问题标题】:How to get parent value and last replaced value in SQL query如何在 SQL 查询中获取父值和最后替换的值
【发布时间】:2017-01-04 22:26:01
【问题描述】:

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

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

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

对此的任何帮助都非常感谢。

谢谢。

【问题讨论】:

    标签: sql sql-server teradata hierarchy


    【解决方案1】:

    假设值是升序的;较新的日期作为较大的值

    使用递归 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 Server 中的分层查询。这个问题扩展了我的思维范围。
    • 只是想检查一下,如果值不是按递增顺序排列的,有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2010-12-27
    • 2021-02-21
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多