Выберите min (также max & avg) из таблицы вместе с отметкой времени события - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть несколько таких таблиц:

> "dsid"    "tag"   "timestamp" "value"  
> "989" "EE"    "1445162347"    "931.647"
> "990" "PO"    "1445162347"    "0.087" 
> "991" "EE"    "1445163247"    "931.669"
> "992" "PO"    "1445163247"    "0.089"
> "993" "EE"    "1445164147"    "931.692"
> "994" "PO"    "1445164147"    "0.085"
> "995" "EE"    "1445165047"    "931.715"
> "996" "PO"    "1445165047"    "0.090"

EE - это количество (в кВтч) счетчика электроэнергии и PO мощность (в кВт) на счетчике, данные считываются изметр каждые 15 минут и записывается в базу данных.

Я ищу МАКС всех значений с TAG "PO", поэтому я исключаю все теги "EE".Я хочу код, который возвращает самое высокое значение, и это соответствует метке времени, которая имеет TAG "PO"

Я намереваюсь использовать этот код, чтобы расширить графическую панель управления (которая уже существует) со значениями MAX, MIN & AVGи их соответствующая отметка времени.

Это код, который у меня есть до сих пор, но, кажется, он всегда выбирает первое значение в диапазоне времени, который я передаю в предложении WHERE:

'''SELECT
    FROM_UNIXTIME(timestamp) as time_sec,
    '1P2' AS Meter,
    tag as metric,
    MIN(value) AS MIN,
    MAX(VALUE) AS MAX,
    AVG(VALUE) AS AVG
  FROM `WSE_KA-KHW_1P2`
  WHERE TAG NOT IN ('EE')
'''

В настоящее время я получаю следующие выходные данные:

"time_sec"  "Meter" "metric"    "MIN"   "MAX" "AVG"
"2015-10-13 08:14:07"   "1P2"   "PO"    "0.000000"  "6.404" "3.2"

Что-то вроде этого:

"time_sec"  "Meter" "metric"    "MIN"   "MAX"  "AVG"
"2015-10-13 08:14:07"   "1P2"   "PO"    "0.1"   ""  ""
"2015-12-13 10:14:07"   "1P2"   "PO"    ""  "6.404"  ""
""  "1P2"   "PO"    ""  ""  "3.2"

В соответствии с запросом, вот несколько строк кода сценария вставки:

INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (909, 'EE', 1445126346, '930.647', 1445125500, 1445126400, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (910, 'PO', 1445126346, '0.088', 1445125500, 1445126400, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (911, 'EE', 1445127246, '930.669', 1445126400, 1445127300, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (912, 'PO', 1445127246, '0.087', 1445126400, 1445127300, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (913, 'EE', 1445128146, '930.691', 1445127300, 1445128200, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (914, 'PO', 1445128146, '0.087', 1445127300, 1445128200, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (915, 'EE', 1445129046, '930.718', 1445128200, 1445129100, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (916, 'PO', 1445129046, '0.138', 1445128200, 1445129100, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (917, 'EE', 1445129947, '930.752', 1445129100, 1445130000, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (918, 'PO', 1445129947, '0.134', 1445129100, 1445130000, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (919, 'EE', 1445130847, '930.782', 1445130000, 1445130900, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (920, 'PO', 1445130847, '0.088', 1445130000, 1445130900, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (921, 'EE', 1445131747, '930.804', 1445130900, 1445131800, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (922, 'PO', 1445131747, '0.087', 1445130900, 1445131800, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (923, 'EE', 1445132647, '930.826', 1445131800, 1445132700, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (924, 'PO', 1445132647, '0.086', 1445131800, 1445132700, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (925, 'EE', 1445133547, '930.848', 1445132700, 1445133600, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (926, 'PO', 1445133547, '0.086', 1445132700, 1445133600, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (927, 'EE', 1445134447, '930.870', 1445133600, 1445134500, 0);
INSERT INTO `WSE_KA-KHW_1P2` (`dsid`, `tag`, `timestamp`, `value`, `startts`, `correctts`, `isfixed`) VALUES (928, 'PO', 1445134447, '0.087', 1445133600, 1445134500, 0);

Дополнительные столбцы после значения не имеют значения ...

THX для @symcbean Теперь я немного ближе к тому, что мне нужно достичь:

SELECT records.*, aggregated.*
 FROM
 (
 SELECT
 from_unixtime(TIMESTAMP),
 tag AS metric,
 MAX(VALUE) AS 1P2_MAX,
 AVG(VALUE) AS 1P2_AVG
 FROM `WSE_KA-KHW_1P2`
 WHERE TAG NOT IN ('EE')
 AND from_unixtime(TIMESTAMP BETWEEN FROM_UNIXTIME(1546297200) AND FROM_UNIXTIME(1577833199))
 ) records JOIN
 (
 SELECT
 tag AS metric,
 MAX(VALUE) AS 1P2_MAX,
 AVG(VALUE) AS 1P2_AVG
 FROM `WSE_KA-KHW_1P2`
 WHERE TAG NOT IN ('EE')
 AND from_unixtime(TIMESTAMP BETWEEN FROM_UNIXTIME(1546297200) AND FROM_UNIXTIME(1577833199))
 GROUP BY metric
 ) aggregated ON
 records.metric=aggregated.metric

I 'мы уже использовали три из них в grafana, получили хорошую таблицу, но она всегда выбирает первое значение времени в базе данных как отметку времени.Но мне нужно вывести временную метку из 1P2_MAX.Таким образом, я буду знать, когда именно произошло МАКС ...

В настоящее время вывод выглядит так:

"from_unixtime(TIMESTAMP)"  "metric"    "1P2_MAX"   "1P2_AVG"   "metric"    "1P2_MAX"   "1P2_AVG"
"2015-10-13 08:14:07"   "PO"    "6.404" "0,4250229947656381"    "PO"    "6.404" "0,4250229947656381"

1 Ответ

0 голосов
/ 24 апреля 2019

Вам нужно GROUP BY FROM_UNIXTIME(timestamp), tag.

(В зависимости от того, как настроена ваша СУБД, вам может потребоваться включить литерал в сгруппированные атрибуты).

Это довольно тривиальная проблема SQL - настолько, что быстрее набрать ответ здесь, а не искать дубликат.

Однако, хотя это отвечает на вопрос, который вы задали - похоже, вы задаете не тот вопрос. Хотя данные вашего примера содержат несколько строк с одним и тем же тегом и отметкой времени, это кажется немного странным. Я подозреваю, что вы, возможно, захотите округлить значения времени, чтобы получить большие ячейки, если вы действительно заинтересованы в совокупных значениях.

ОБНОВЛЕНИЕ на основе комментариев ниже

Если вы хотите, чтобы агрегированные значения не соответствовали определенному времени ....

SELECT records.*, aggregated.*
FROM
(
  SELECT *
  FROM `WSE_KA-KHW_1P2`
  WHERE TAG NOT IN ('EE')
  AND timestamp BETWEEN _____ AND _____
) records JOIN
(
  SELECT
  tag AS metric,
  MIN(value) AS minval,
  MAX(VALUE) AS maxval,
  AVG(VALUE) AS avgval
  FROM `WSE_KA-KHW_1P2`
  WHERE TAG NOT IN ('EE')
  AND timestamp BETWEEN _____ AND _____
  GROUP BY tag
) aggregated ON
records.tag=aggregated.tag

Но это нечто отличное от того, что вы спрашивали в последующих правках на ваш вопрос:

Мне нужен код, который возвращает наибольшее значение и соответствует метке времени с тегом «PO»

Это новое требование. И хотя в ваших выборочных данных PO - «НЕ В (EE)», это не обязательно означает, что это выражение является общительным. Оставляя это в стороне, вы, похоже, просите «групповой максимум», который вы можете решить с помощью max concat trick или подзапроса

...