SQL服务器查询问题。示例在 excel sheet 图片中

SQL Server query problem. example is in excel sheet picture

请看下面的图片,我想在 SQL 服务器中转换这个公式。 在 excel sheet

        M   N
    15  1   0
    16  3   1
    17  5   2
    18  8   4
    19  9   4


    N= IF(M16-M15<=1,N15,M16-M15-1+N15

请看截图参考:

根据您的标签,这可以通过 LAG 完成,然后总共 运行。

  • 对于每一行,首先计算 M 与前一行的差异(使用 LAG)——我称之为 Dif_Last_M。这反映了公式的 'M24-M23' 部分。
  • 如果 Dif_Last_M <= 1,将 0 添加到 运行 总数(有效地使 运行 总数与上一行相同)
  • 否则,如果 Dif_Last_M > 1,则将 (Dif_Last_M 减 1) 添加到 运行 总计

这是假设您的源 table 名为 #Temp 并且具有 ID(排序值)

的代码
WITH M_info AS
    (SELECT  ID, M, (M - LAG(M, 1) OVER (ORDER BY ID)) AS Dif_Last_M
        FROM #Temp
    )
SELECT  ID, 
        M, 
        SUM(CASE WHEN Dif_Last_M > 1 THEN Dif_Last_M - 1 ELSE 0 END) OVER (ORDER BY ID) AS N
FROM    M_info;

这是结果

ID  M   N
1   1   0
2   3   1
3   5   2
4   8   4
5   9   4
6   12  6
7   13  6

这是一个db<>fiddle上面的。它还包括显示

的其他查询
  • CTE 的结果
  • 运行 总计
  • 中使用的值

请注意,虽然可以使用递归 CTE 执行此操作,但它们往往会出现性能问题(从根本上说,它们是循环)。因此,如果可能的话,最好(性能方面)避免递归 CTE。