【问题标题】:SQL Server query problem. example is in excel sheet pictureSQL Server 查询问题。示例在 excel 工作表图片中
【发布时间】: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
lag
lead
【解决方案1】:
根据您的标签,这可以通过 LAG 来完成,然后进行总计。
- 对于每一行,首先计算 M 与前一行的差异(使用 LAG) - 我称之为
Dif_Last_M。这反映了公式中的“M24-M23”部分。
- 如果
Dif_Last_M
- 否则,如果
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<>fiddle 上面的内容。它还包括显示的其他查询
请注意,虽然递归 CTE 可以做到这一点,但它们往往存在性能问题(从根本上说,它们是循环)。因此,如果可能的话,最好避免递归 CTE(在性能方面)。