SQL Server派生的列,使用上一行中的前一个值

SQL Server派生的列,使用上一行中的前一个值,sql,sql-server,Sql,Sql Server,我需要在SQLServer中创建一个派生列ColumnC。规则是ColumnC的第一行是ColumnA和ColumnB的乘积。以下行是ColumnC中前一行的乘积,按年份乘以ColumnA*ColumnC排序 +-----------+--------------------------+------------------------+ | **Year** | **ColumnA** | **ColumnB** | +-----------+

我需要在SQLServer中创建一个派生列ColumnC。规则是ColumnC的第一行是ColumnA和ColumnB的乘积。以下行是ColumnC中前一行的乘积,按年份乘以ColumnA*ColumnC排序

+-----------+--------------------------+------------------------+
| **Year**  |        **ColumnA**       |      **ColumnB**       |
+-----------+--------------------------+------------------------+
|  2020     |        0.987441          |        0.001039        |
+-----------+--------------------------+------------------------+
|  2021     |        0.975952          |        0.001117        |
+-----------+--------------------------+------------------------+
|  2022     |        0.965471          |        0.001206        |
+-----------+--------------------------+------------------------+
|  2023     |        0.955950          |        0.001293        |
+-----------+--------------------------+------------------------+
|  2024     |        0.947347          |        0.001387        |
+-----------+--------------------------+------------------------+
|  2025     |        0.939604          |        0.001488        |
+-----------+--------------------------+------------------------+
|  2026     |        0.933461          |        0.001596        |
+-----------+--------------------------+------------------------+
|  2027     |        0.922700          |        0.001710        |
+-----------+--------------------------+------------------------+
|  2028     |        0.914439          |        0.001959        |
+-----------+--------------------------+------------------------+
|  2029     |        0.900277          |        0.002134        |
+-----------+--------------------------+------------------------+
为了保持示例的简单性,我简化了计算和表格,因此,我需要按所述计算列

遵守以下算法对我来说至关重要:ColumnC的第一行是ColumnA和ColumnB的乘积,从第二行开始,使用前一行ColumnC,按年份乘以ColumnB乘以ColumnC排序

我最大的问题是,我不知道如何设置ColumnC的前一个值。我无法使用
LAG
,因为该列尚不存在

SELECT
    ColumnA,
    ColumnB,
    /* First row okay. But the following rows should 
     use the previous value of ColumnC times ColumnA times ColumnB
     that is ColumnC(Year-1) * ColumnA * ColumnB
    CASE WHEN ROW_NUMBER() OVER (ORDER BY Year) = 1 THEN
        ColumnA * ColumnB
    ELSE
        LAG(ColumnC) OVER (ORDER BY Year) * ColumnA * ColumnB
    END AS ColumnC
    */
    (ColumnA * ColumnB) AS ColumnC
FROM TableA
这行不通:

CASE WHEN ROW_NUMBER() OVER (ORDER BY Year ASC) = 1 THEN
    ColumnA * ColumnB
ELSE
    LAG(ColumnC) OVER (ORDER BY Year ASC) * ColumnA * ColumnB
END AS ColumnC
请帮我理解我的问题

从第C列计算第一行:

从C列第二行开始计算:

结果:


数字很快变小,但这与您所描述的相符:

select a.*, 
       columna * columnb,
       exp(sum(log(columna * columnb)) over (order by year))
from tableA a

数字很快就变小了,但这就是你所描述的:

select a.*, 
       columna * columnb,
       exp(sum(log(columna * columnb)) over (order by year))
from tableA a

根据所提供的信息,这就是你想要的吗

DROP TABLE IF EXISTS #TableA

CREATE TABLE #TableA (
    [Year] INT,
    ColumnA DECIMAL(8, 6),
    ColumnB DECIMAL(8, 6)
)

INSERT INTO #TableA (
  [Year],
  ColumnA,
  ColumnB
)
VALUES
    (2020, 0.987441, 0.001039),
    (2021, 0.975952, 0.001117),
    (2022, 0.965471, 0.001206),
    (2023, 0.955950, 0.001293),
    (2024, 0.947347, 0.001387),
    (2025, 0.939604, 0.001488),
    (2026, 0.933461, 0.001596),
    (2027, 0.922700, 0.001710),
    (2028, 0.914439, 0.001959),
    (2029, 0.900277, 0.002134);

    SELECT *, CASE WHEN ROW_NUMBER() OVER (ORDER BY Year ASC) = 1 THEN ColumnA * ColumnB
              ELSE LAG(ColumnB) OVER (ORDER BY Year ASC) * ColumnA * ColumnB
               END AS ColumnC
      FROM #TableA

根据所提供的信息,这就是你想要的吗

DROP TABLE IF EXISTS #TableA

CREATE TABLE #TableA (
    [Year] INT,
    ColumnA DECIMAL(8, 6),
    ColumnB DECIMAL(8, 6)
)

INSERT INTO #TableA (
  [Year],
  ColumnA,
  ColumnB
)
VALUES
    (2020, 0.987441, 0.001039),
    (2021, 0.975952, 0.001117),
    (2022, 0.965471, 0.001206),
    (2023, 0.955950, 0.001293),
    (2024, 0.947347, 0.001387),
    (2025, 0.939604, 0.001488),
    (2026, 0.933461, 0.001596),
    (2027, 0.922700, 0.001710),
    (2028, 0.914439, 0.001959),
    (2029, 0.900277, 0.002134);

    SELECT *, CASE WHEN ROW_NUMBER() OVER (ORDER BY Year ASC) = 1 THEN ColumnA * ColumnB
              ELSE LAG(ColumnB) OVER (ORDER BY Year ASC) * ColumnA * ColumnB
               END AS ColumnC
      FROM #TableA

编辑你的问题并显示你想要的结果。谢谢,戈登!我编辑了这个问题,并在谷歌表单中添加了结果和示例。我也会测试你的解决方案。编辑你的问题并显示你想要的结果。谢谢,戈登!我编辑了这个问题,并在谷歌表单中添加了结果和示例。我也会测试你的解决方案。哇!谢谢你的快速回答,但我认为林诺夫先生关于指数的想法会更有效地帮助我。哇!谢谢你的快速回答,但我认为林诺夫先生关于指数的想法会更有效地帮助我。嗨,林诺夫先生!谢谢你的回答。我要用指数来推导它。好的。嗨,林诺夫先生!谢谢你的回答。我要用指数来推导它。那就行了。