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。
请看下面的图片,我想在 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。