将零值替换为零,然后再从同一组的前一行中减去该行

时间:2019-04-17 05:26:58

标签: mysql sql

我对减法和空值有疑问。这是我的代码,分别计算当前行中的值(子查询中的列值)与每个组中的上一个值(上一个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 :(得分:0)

使用合并

<Rowset>