如何使用递归CTE获取上一行和当前行的值? [英] How to get previous and current row value using recursive CTE?

查看:53
本文介绍了如何使用递归CTE获取上一行和当前行的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下内容

Id  Nums
1   10
2   20
3   30
4   40
5   50

预期产出

Id  CurrentValue    PreviousValue
1   10              Null
2   20              10
3   30              20
4   40              30
5   50              40

我正在尝试以下操作,但没有运气

I am trying with the below but no luck

;With Cte(Id,CurrValue,PrevValue) As
(
    Select 
        Id
        ,CurrentValue = Nums 
        ,PreviousValue = Null
        From @t Where Id = 1
    Union All
    Select
        t.Id
        ,c.CurrValue
        ,c.PrevValue
    From Cte c
    Join @t t On c.Id <= t.Id + 1

)
Select *
From Cte

需要帮助

推荐答案

这假定ID值增加,并且将l带有ID的空白

This assumes increasing ID values and will deal with gaps in ID

SELECT
   ID, 
   This.Number AS CurrentValue, 
   Prev2.Number AS PreviousValue
FROM
   myTable This
   OUTER APPLY
   (
    SELECT TOP 1
       Number
    FROM
       myTable Prev
    WHERE
       Prev.ID < This.ID  -- change to number if you want
    ORDER BY
       Prev.ID DESC
   ) Prev2;

OR

WITH CTE
     AS (SELECT ID,
                Number,
                ROW_NUMBER() OVER (ORDER BY ID) AS rn
         FROM   Mytable)
SELECT ID,
       This.Number AS CurrentValue,
       Prev.Number AS PreviousValue
FROM   CTE This
       LEFT JOIN CTE Prev
         ON Prev.rn + 1 = This.rn; 

对于SQL Server 2012

And for SQL Server 2012

SELECT
   ID,
   Number AS CurrentValue,
   LAG(Number) OVER (ORDER BY ID) AS PreviousValue
FROM
   MyTable

这篇关于如何使用递归CTE获取上一行和当前行的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆