Запрос MYSQL для данных о почасовом / ежедневном потреблении - PullRequest
0 голосов
/ 02 июня 2018

Привет, мне нужна помощь с запросом SQL.У меня есть таблица базы данных, заполненная данными потребления смартметра.Новые записи будут добавляться в базу данных каждую минуту.Для внешнего интерфейса я хочу показать графики ежедневного / почасового потребления.Таблица базы данных выглядит следующим образом:

Timestamp              AWATT BWATT CWATT
2018-06-01 21:33:56    13.45 4.3   2.78
2018-06-01 21:34:56    14.01 5.0   2.89
...

Потребление постоянно увеличивается.Поэтому я хочу получить разницу в потреблении за каждый полный час и за фактический период, когда запрос обрабатывается только с указанием для базы данных даты или месяца.

например.

Timestamp       AWATT BWATT CWATT
00:00 - 01:00   x     y     z
01:00 - 02:00   x1    y1    z1
02:00 - 02:38   x2    y2    z3

Запрос выполняется в 02:38.

Я не хочу выполнять вычисления после выполнения запроса.MYSQL должен сделать эту работу за меня.

То, что у меня есть на данный момент:

select extract(hour from timestamp) as theInterval
     , awatthr 
     , bwatthr 
     , cwatthr 
  from value_table 
 where date_format(timestamp, '%d-%m-%Y') = '01-06-2018' 
 group 
    by extract(hour from timestamp)

Результат:

theInterval awatthr bwatthr cwatthr 
0           2955.33 10100.6 13434.8 
1           2963.17 10179.6 13556.5 
2           2994    10251.2 13677.3 
...
22          5702    11704.5 15944.6 
23          6876.93 12078.2 16213.7 

это дает мне фактическое значение для каждого полногочас, но не вычисляет разницу между ними.

Можете ли вы помочь мне добавить недостающую часть в этот запрос?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018
SELECT (MAX(awatthr) - MIN(awatthr)) AS awatthr_diff, 
(MAX(bwatthr) - MIN(bwatthr)) AS bwatthr_diff, 
(MAX(cwatthr) - MIN(cwatthr)) AS cwatthr_diff, 
timestamp FROM 
`consumption_table` WHERE timestamp > '01-06-2018 00:00:00' AND 
timestamp < '01-06-2018 23:59:59' GROUP BY HOUR(timestamp)");

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

0 голосов
/ 02 июня 2018

Один метод - это самостоятельное объединение:

select h.*,
       (h.awatthr - hprev.awatthr) as awatthr_diff,
       (h.bwatthr - hprev.bwatthr) as bwatthr_diff,
       (h.cwatthr - hprev.cwatthr) as cwatthr_diff
from (select extract(hour from timestamp) as theInterval, awatthr as awatthr, bwatthr as bwatthr, cwatthr as cwatthr
      from value_table
      where timestamp >= '2018-06-01' and timestamp < '2018-06-02'
      group by extract(hour from timestamp)
     ) h left join
     (select extract(hour from timestamp) as theInterval, awatthr as awatthr, bwatthr as bwatthr, cwatthr as cwatthr
      from value_table
      where timestamp >= '2018-06-01' and timestamp < '2018-06-02'
      group by extract(hour from timestamp)
     ) hprev
     on h.theInterval = hprev.theInterval + 1;

Следует отметить, что для «нормального» подхода SQL к этому просто используется оконная функция lag(), которая теперь доступна в MySQL 8.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...