Замена нулевых значений на ноль перед вычитанием строки из предыдущей строки в той же группе - PullRequest
1 голос
/ 17 апреля 2019

У меня есть вопрос, касающийся вычитания и нулевых значений.Вот мой код, который вычисляет вычитание между значением (значение столбца в подзапросе) в текущей строке и в предыдущем (предыдущий DateTime) в каждой группе отдельно:

WITH CTE (DateTime, Compteur, Valeur) AS 
(
SELECT DateTime, Compteur, CASE WHEN Valeur<0 OR Valeur IS NULL THEN 0 ELSE Valeur END AS Valeur
FROM
(
    SELECT  DateTime, TagName AS Compteur
    ,       Value - LAG(Value, 1, NULL) OVER (PARTITION BY TagName ORDER BY DateTime) AS Valeur
    FROM History 
    WHERE  TagName IN ('A','B')
    AND DateTime >='2018-12-31 23:59:00'
    AND wwRetrievalMode='Delta'
)t
WHERE t.DateTime >='2018-12-31 23:59:59'
)
SELECT DateTime, Compteur, Valeur INTO #tempcounters from CTE

Но еслизначение в предыдущей строке равно NULL, тогда вычитание дает NULL.Чтобы избежать этой проблемы, я хотел бы заменить все значения NULL на предыдущие значения, отличные от NULL, в той же группе перед вычитанием.Вот пример:

|---------------------|------------------|-----------------|
|     DateTime        |     Compteur     |      Valeur
|---------------------|------------------|-----------------
|  15.04.2019 16:51:30|         A        |       10
|---------------------|------------------|----------------- 
|  15.04.2019 16:52:42|         A        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 16:53:14|         A        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         A        |       15
|---------------------|------------------|----------------- 
|  15.04.2019 16:51:30|         B        |       6
|---------------------|------------------|----------------- 
|  15.04.2019 16:52:42|         B        |       9
|---------------------|------------------|-----------------
|  15.04.2019 16:53:14|         B        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         B        |       15
|---------------------|------------------|---------------- 

Новая таблица должна выглядеть следующим образом:

|---------------------|------------------|-----------------|
|     DateTime        |     Compteur     |      Valeur
|---------------------|------------------|-----------------
|  15.04.2019 16:51:30|         A        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 16:52:42|         A        |       0
|---------------------|------------------|----------------- 
|  15.04.2019 16:53:14|         A        |       0
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         A        |       5
|---------------------|------------------|----------------- 
|  15.04.2019 16:51:30|         B        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 16:52:42|         B        |       3
|---------------------|------------------|-----------------
|  15.04.2019 16:53:14|         B        |       0
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         B        |       6
|---------------------|------------------|---------------- 

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 17 апреля 2019

используйте coalesce

WITH CTE (DateTime, Compteur, Valeur) AS 


(
SELECT DateTime, Compteur, CASE WHEN Valeur<0 OR Valeur IS NULL THEN 0 ELSE Valeur END AS Valeur
FROM
(
    SELECT  DateTime, TagName AS Compteur
    ,       Value - coalesce( LAG(Value, 1, NULL) OVER (PARTITION BY TagName ORDER BY DateTime),0) AS Valeur
    FROM History 
    WHERE  TagName IN ('A','B')
    AND DateTime >='2018-12-31 23:59:00'
    AND wwRetrievalMode='Delta'
)t
WHERE t.DateTime >='2018-12-31 23:59:59'
)
SELECT DateTime, Compteur, Valeur INTO #tempcounters from CTE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...