在 SQL 中实施自定义公式

Implement custom formula in SQL

能否请您帮助在 SQL 服务器中实现以下公式?我现在很纳闷。

这是table:

| Row Number | Column Number L | Column  Number M |    Colum Number Z     |                     Formula                 |

|        117 | 11.98           | 12.34141         | 0.3614100028772230000 |   L117*(Z117)                               |
|        368 | 14.3            | 14.789574        | 0.056470999155824700  | L368*(Z368)-((M117-L117)*(M368/M117))       |
|        620 | 13.45           | 14.034546        | 0.119965883942196000  | L620*(Z620)-((M368-L368)*(M620/M368))       |
|        869 | 15.78           | 16.731183        | 0.254320519446635000  | L869*(Z869)-((M620-L620)*(M869/M620))       |
|       1125 | 20.4            | 22.690612        | 1.000629762258830000  | L1125*(Z1125)-((M869-L869)*(M1125/M869))    |
|       1376 | 20.85           | 25.478565        | 2.056509721684180000  | L1376*(Z1376)-((M1125-L1125)*(M1376/M1125)) |
+------------+-----------------+------------------+-----------------------+---------------------------------------------+

如果您碰巧使用 SQL Server 2012+,您可以使用 LAG 来帮助您获得计算所需的值。

由于第一行与其余行不同,您可以使用 case 语句来获取它的值,并将其他行分开。

测试数据:

CREATE TABLE Table1
    ([Row] int, [L] int, [M] int, [Z] float)
;

INSERT INTO Table1
    ([Row], [L], [M], [Z])
VALUES
    (117, 11.98, 12.34141, 0.3614100028772230000),
    (368, 14.3, 14.789574, 0.056470999155824700),
    (620, 13.45, 14.034546, 0.119965883942196000),
    (869, 15.78, 16.731183, 0.254320519446635000),
    (1125, 20.4, 22.690612, 1.000629762258830000),
    (1376, 20.85, 25.478565, 2.056509721684180000)
;

查询:

SELECT
    [Row],
    L,
    M,
    Z,
    CASE WHEN t.Rn = 1 THEN L * Z 
    ELSE L * Z - ((PrevM-PrevL) * (M/PrevM)) END Formula
 FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) Rn,
        LAG(L) OVER (ORDER BY [Row]) PrevL,
        LAG(M) OVER (ORDER BY [Row]) PrevM,
        LAG(Z) OVER (ORDER BY [Row]) PrevZ
    FROM Table1
) t

对于 SQL 2008,您可以使用子查询和 ROW_NUMBER 来获得相同的结果。

SELECT
    curr.[Row],
    curr.L,
    curr.M,
    curr.Z,
    CASE WHEN curr.Rn = 1 THEN curr.L * curr.Z 
    ELSE curr.L * curr.Z - ((prev.M-prev.L) * (curr.M/prev.M)) END Formula
 FROM
    (SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) Rn FROM Table1)  curr
    LEFT JOIN (SELECT *, ROW_NUMBER() OVER (ORDER BY [Row]) + 1 Rn FROM Table1) prev ON curr.Rn = prev.Rn