Warm tip: This article is reproduced from serverfault.com, please click

其他-SQL Server查询问题。

(其他 - SQL Server query problem. example is in excel sheet picture)

发布于 2020-11-28 16:25:41

请查看下面的图片,我想在SQL Server中转换此公式。在Excel工作表中

        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

请参阅屏幕截图以供参考:

SQL Server中所需的Excel公式用于计算

Questioner
Jans
Viewed
22
seanb 2020-11-29 03:37:48

根据你的标签,可以使用LAG进行此操作,然后进行总计运行。

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

这是假设你的源表称为#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 <>小提琴它还包括其他查询,显示

  • CTE的结果
  • 运行总计中使用的值

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