通过合计划分现有行来添加新行

时间:2019-04-16 10:58:15

标签: mysql sql

我正在通过SQL查询连接到Tableau上的MySql数据库。我有一个包含三列的表格(DateTime,Compteur和Valeur)。我想做的是通过添加/相乘/划分现有行来添加新行。

|---------------------|------------------|-----------------|
|     DateTime        |     Compteur     |      Valeur
|---------------------|------------------|-----------------
|  15.04.2019 16:51:30|         A        |       5
|---------------------|------------------|----------------- 
|  15.04.2019 17:57:42|         A        |       6
|---------------------|------------------|----------------- 
|  15.04.2019 16:52:14|         B        |       NULL
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         B        |       8
|---------------------|------------------|----------------- 
|  15.04.2019 16:51:30|         C        |       5
|---------------------|------------------|----------------- 
|  15.04.2019 17:57:42|         C        |       6
|---------------------|------------------|-----------------
|  15.04.2019 16:52:14|         D        |       8
|---------------------|------------------|----------------- 
|  15.04.2019 17:52:14|         D        |       9
|---------------------|------------------|---------------- 
|       (NEW ROW)
  15.04.2019 16:00:00 |      K           |       3.0769
|---------------------|------------------|---------------- 
|       (NEW ROW)
  15.04.2019 17:00:00 |      K           |       8.4
|---------------------|------------------|----------------

目标是执行以下操作:(A + B)/(C + D)* D。计算应每小时进行一次,并以字符串形式在新行中添加新的compteur名称。在计算中,空值应视为零。您能否提供可以满足我要求的通用代码。预先感谢!

这已经是我必须从数据库接收数据的条件。我正在计算差异,因为这些值是累加的,所以我必须通过减去每个Compteur的上一行来找到对应的DateTime的值:

SELECT DateTime, Compteur, 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 
                    (
                     'H270ME01MDB90.vol',
                    'H270ME01MDB91.vol',
                    'HA44AC01CDI07.vol',
                    'HA44AC01CDI06.vol',
                    ) 
    AND DateTime >='2018-12-31 23:59:00'
    AND wwRetrievalMode='Delta'
)t
WHERE t.DateTime >='2018-12-31 23:59:59'

1 个答案:

答案 0 :(得分:0)

您可以使用CTE和UNION ALL进行所需的计算:

WITH t as (
      SELECT DateTime, Compteur, 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 ('H270ME01MDB90.vol', 'H270ME01MDB91.vol', 'HA44AC01CDI07.vol', 'HA44AC01CDI06.vol',
                              )  AND
                  DateTime >='2018-12-31 23:59:00' AND
                  wwRetrievalMode = 'Delta'
           ) t
       WHERE t.DateTime >= '2019-01-01'  -- seems simpler
      )
SELECT t.*
FROM t
UNION ALL
(SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(DATETIME) / 3600) * 3600) as hour,
        'K' as compteur,
        (SUM(CASE WHEN Compteur IN ('A', 'B') THEN Valeur END) /
         SUM(CASE WHEN Compteur IN ('C', 'D') THEN Valeur
             END)
        ) * SUM(CASE WHEN Compteur IN ('D') THEN Valeur END)
 FROM t
 GROUP BY hour
);