我正在通过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'
答案 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
);