Допустим, у меня есть таблица со столбцами CurrentDateTime
и CurrentValue
, где столбец CurrentValue
в основном увеличивается. Иногда, однако, CurrentValue
сбрасывает, вот где начинаются проблемы.
Так что, если бы не было сброса время от времени, я мог бы просто сделать это:
SELECT MAX(CurrentValue)-MIN(CurrentValue) AS AccumulateValue
FROM Table
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, CurrentDateTime), 0);
Если CurrentValue
сбрасывается, AccumulateValue
неверно.
Допустим, это значения, которые я получил:
CurrentDateTime CurrentValue
-------------------------------
2019-10-01 100
2019-10-02 101
2019-10-03 102
2019-10-04 103
2019-10-05 104
2019-10-06 105
Это вернет 5
Но если значения выглядят следующим образом:
CurrentDateTime CurrentValue
-------------------------------
2019-10-01 100
2019-10-02 101
2019-10-03 102
2019-10-04 103
2019-10-05 104
2019-10-06 0
2019-10-07 1
2019-10-08 2
2019-10-09 3
Результат будет 101, и он должен быть 7.
Я пробовал это (вычисление разницы между каждой строкой и запуск только SUMположительные значения):
SELECT SUM(CurrentValue)
FROM
(SELECT
tb1.CurrentDateTime,
CASE
WHEN tb1.CurrentValue > tb1.CurrentValueLag
THEN (tb1.CurrentValue - tb1.CurrentValueLag)
WHEN tb1.CurrentValue <= tb1.CurrentValueLag
THEN 0
END AS CurrentValue
FROM
(SELECT
*,
LAG(CurrentValue) OVER (ORDER BY CurrentDateTime ASC) AS CurrentValueLag
FROM Table) AS tb1) AS tb2
GROUP BY
DATEADD(MONTH, DATEDIFF(MONTH, 0, CurrentDateTime), 0);
Эта таблица довольно велика с небольшими приращениями, и SUM не верна по какой-то причине, которую я не могу понять. Я заметил, что при сравнении месяца (без сброса) значение из этого последнего запроса показывает более высокое значение, чем правильное значение.