SQL Сервер - столбец, полученный с использованием его собственного предыдущего значения из второй строки на - PullRequest
1 голос
/ 05 мая 2020

Мне нужно создать производный столбец, Столбец C, на SQL сервере. Правило гласит, что первая строка столбца C является произведением столбца A и столбца B. Следующие строки являются продуктом предыдущей строки в столбце C, упорядоченном по годам, умноженным на ColumnA * Column C.

+-----------+--------------------------+------------------------+
| **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        |
+-----------+--------------------------+------------------------+

Для простоты примера я упростил вычисления и таблицу, поэтому , Мне нужно, чтобы столбец вычислялся, как описано.

Для меня важно соблюдение следующего алгоритма: первая строка столбца C является произведением столбца A и столбца B, следующих строк, из второй строки на используйте предыдущую строку столбца C, упорядоченного по годам, умноженным на столбецB, умножив на столбец C.

Моя самая большая проблема, из-за которой я застрял, заключается в том, что я не знаю, как получить предыдущее значение столбца C. Я не могу использовать 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

Пожалуйста, помогите мне разобраться в моей проблеме.

Бесполезно SQL Fiddle

Расчет первой строки из столбца C:

enter image description here

Расчет со второй строки по столбцу C:

enter image description here

Результаты:

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Это то, что вы ищете на основании предоставленной информации.

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
0 голосов
/ 05 мая 2020

Числа становятся очень маленькими очень быстро, но вот что вы описываете:

select a.*, 
       columna * columnb,
       exp(sum(log(columna * columnb)) over (order by year))
from tableA a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...