我有一个关于减法和空值的问题。这是我的代码,它分别计算当前行中的值(子查询中的列值)与每个组中的前一个值(前一个 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
|---------------------|------------------|----------------
欢迎任何帮助!
最佳答案
使用合并
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
关于mysql - 在从同一组中的前一行中减去该行之前,将空值替换为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55720455/