【问题标题】: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 可以做到这一点,但它们往往存在性能问题(从根本上说,它们是循环)。因此,如果可能的话,最好避免递归 CTE(在性能方面)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多