SQL Server - 递归计算列

Arc*_*ird 5 sql-server

我需要计算基于种子行的列,其中每行的值使用“前一”行的值。我觉得这应该是一个递归查询,但我不能完全理解它。

为了显示:

BOP     EOP     IN     OUT     Wk_Num
--------------------------------------
6       4       10     12      1
?       ?       2      6       2
?       ?       7      5       3
...     ...     ...    ...     ...
Run Code Online (Sandbox Code Playgroud)

因此下一行的 BOP 和 EOP 列需要使用种子行进行计算。IN 和 OUT 值已存在于表中。

BOP =(上一行的 EOP)

EOP =(上一行的 EOP)+ IN - OUT [其中 IN 和 OUT 来自当前行)

此示例的输出应如下所示:

BOP     EOP     IN     OUT     Wk_num
-------------------------------------
6       4       10     12      1
4       0       2      6       2
0       2       7      5       3
2       6       4      0       4
...     ...     ...    ...     ...
Run Code Online (Sandbox Code Playgroud)

Mil*_*ney 4

您可以为此使用递归 CTE;

WITH RecursiveCTE AS (
  -- Base Case
  SELECT
    BOP,
    EOP,
    [IN],
    [OUT],
    [WK_Num]
  FROM [someTable]
  WHERE BOP IS NOT NULL

  UNION ALL

  SELECT
      r.EOP AS BOP,
      r.EOP + r2.[In] - r2.[Out] AS EOP,
      r2.[IN],
      r2.[OUT],
      r2.[WK_Num]
  FROM [someTable] r2
  INNER JOIN [RecursiveCTE] r
     ON r2.[Wk_Num] = r.[Wk_Num] + 1
)
SELECT * FROM RecursiveCTE
Run Code Online (Sandbox Code Playgroud)

这是一个 SQL 小提琴:http://sqlfiddle.com/#!18/ e041f/1

您基本上将基本情况定义为第一行(通过说 BOP != null 的行),然后使用 Wk_Num + 1 连接连接到接下来的每一周,并引用前面的行值