在 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
能否请您帮助在 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