mysql - 在从同一组中的前一行中减去该行之前,将空值替换为零

标签 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
|---------------------|------------------|---------------- 

欢迎任何帮助!

最佳答案

使用合并

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/

相关文章:

带有 JOIN、SUM 和 GROUP BY 的 SQL SELECT 查询

mysql - 在 SQL Server 中使用 LIKE 和通配符获取月份或日期会出错

java - MySQL 或 Hibernate 缓存问题接收旧数据

Mysql搜索每个单词

mysql - 获取mysql结果raw的索引

mysql - INNER JOIN + IN 条件不起作用

mysql - SQL - 选择每个 IN 参数的相同数量的结果

sql - 是否可以在 SAP HANA 的字典 View 中查找表值函数的返回列?

asp.net - NHibernate 的多数据库

mysql - 在包含唯一值的列上添加索引?