sql-server-2005 - 如何使用递归 CTE 获取前一行和当前行值?

标签 sql-server-2005 common-table-expression

考虑以下

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

我正在尝试以下但没有运气
;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 值并将处理 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;

或者
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
SELECT
   ID,
   Number AS CurrentValue,
   LAG(Number) OVER (ORDER BY ID) AS PreviousValue
FROM
   MyTable

关于sql-server-2005 - 如何使用递归 CTE 获取前一行和当前行值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9127636/

相关文章:

sql-server-2005 - 使用开放查询功能从sql server执行oracle存储过程

sql - 针对大型 SQL Server 表(100-2 亿条记录)的最佳优化

Sql单索引或多索引

sql - 在自引用表上编写递归 SQL 查询

TSQL CTE : How to avoid circular traversal?

mysql - SELECT 类型查询是唯一可以嵌套的类型吗?

database - 使 SQL Server 数据库脱机时等待时间过长

visual-studio-2008 - 开发环境的最佳 SQL Server 设置是什么?

sql-server - 为什么这个 CTE 比使用临时表慢这么多?

sql - 在 DELETE 中使用 CTE 未执行