sql-server - SQL Server 查询问题。示例在 excel 工作表图片中
问题描述
请看下面的图片,我想在 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
请参阅截图以供参考:
解决方案
根据您的标签,这可以通过 LAG 完成,然后进行总计。
- 对于每一行,首先计算 M 与前一行的差异(使用 LAG) - 我称之为
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<>fiddle。它还包括显示的附加查询
- CTE 的结果
- 运行总计中使用的值
请注意,虽然递归 CTE 可以做到这一点,但它们往往存在性能问题(从根本上说,它们是循环)。因此,如果可能的话,避免递归 CTE 会更好(在性能方面)。
推荐阅读
- excel - 没有 VBA 的 Excel:如何从列中创建序列号跟随模式
- floating-point - GAS 汇编器打印浮点数
- redis - 使用 Digital Ocean 托管实例的 Redis 性能
- java - 如何在单击按钮时将自定义布局添加到线性布局
- azure - SonarQube Azure AD 集成
- batch-file - 使用 bat 文件设置系统变量
- go - go-gin中如何调用接口函数?
- flutter - 如何在 Flutter 的时间序列图中添加多条线
- javascript - 如何从 Paypal 的按钮捕获并安全地验证付款完成?
- cypher - Cypher:如何使用替代项创建递归成本查询?