Добавление новых строк путем суммирования деления существующих строк - PullRequest
0 голосов
/ 16 апреля 2019

Я подключаюсь к базе данных MySql в Tableau с помощью SQL-запроса. У меня есть таблица с тремя столбцами (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 в строке. Нулевые значения должны рассматриваться как ноль в расчетах. Не могли бы вы предоставить общий код, который мог бы делать то, что я хочу. Заранее спасибо!

Это уже то, что я должен получить данные из базы данных. Я вычисляю разницу, так как значения накапливаются, поэтому я должен найти значение для соответствующего DateTime, вычтя из предыдущей строки в каждом Compteur:

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 голосов
/ 16 апреля 2019

Вы можете использовать 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...