Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Доброго дня!
Имею совсем небольшой опыт MySQL.
Есть таблица datalog, в которую пишется время, номер наблюдаемой установки(всего их 9) и мощность на момент времени
Итого три столбика ModuleN, DateTime, P.
Нужно запросом или во временную таблицу получить данные формата
Дата в порядке Номера Средняя(!) мощность
возрастания установки за сутки
в порядке
возрастания
соответственно дате
Для первой установки запрос выглядит примерно вот так
CREATE TEMPORARY TABLE `avgp`
SELECT date(DateTime) as DatTime, IFNULL(AVG(P), 0.00) as Module1_AVGP FROM datalog where
DateTime between str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') AND ModuleN='1' GROUP BY DatTime;
SELECT * FROM `avgp`;
Как это сделать для всех установок?
Дата начала и конца наблюдения переменные, объявляемые извне.
Заранее спасибо!
Неактивен
Неактивен
Спасибо!
Сейчас понял,что неверно поставил задачу...
Необходим вывод в таблицу
+---------+---------------------+--------------------+--------------------+--------+---------------------+
| Дата | AVG(P) модуль 1 | AVG(P) модуль 2 | AVG(P) модуль 3 | ........ | AVG(P) модуль 9 |
Вот на этом я и завис давно....
Пробовал чтото такое,но это явно неверно. Слишком сложно и неудобно для замены переменных даты
CREATE TEMPORARY TABLE `temp`
SELECT M1.d1 as DATE_TIME, M1.AVGP as M1_AVGP, M2.AVGP as M2_AVGP, M3.AVGP as M3_AVGP, M4.AVGP as M4_AVGP
FROM
(SELECT date(DateTime) as d1, IFNULL(AVG(P), 0.0001) as AVGP FROM datalog where DateTime between
str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') AND ModuleN='1' GROUP BY d1)M1,
(SELECT date(DateTime) as d2, IFNULL(AVG(P), 0.0001) as AVGP FROM datalog where DateTime between
str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') AND ModuleN='2' GROUP BY d2)M2,
(SELECT date(DateTime) as d3, IFNULL(AVG(P), 0.0001) as AVGP FROM datalog where DateTime between
str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') AND ModuleN='3' GROUP BY d3)M3,
(SELECT date(DateTime) as d4, IFNULL(AVG(P), 0.0001) as AVGP FROM datalog where DateTime between
str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') AND ModuleN='4' GROUP BY d4)M4
GROUP BY M1.d1;
SELECT * FROM `temp`;
Неактивен
И при этом какие то значения могут быть NULL
Неактивен
SELECT date(DateTime) as DatTime, AVG(if(ModuleN=1,P,0)) as Module1_AVGP, ... AVG(if(ModuleN=9,P,0)) as Module9_AVGP
FROM datalog where
DateTime between str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') GROUP BY DatTime;
Неактивен
Antonioni написал:
И при этом какие то значения могут быть NULL
тогда
AVG(if(ModuleN=9,ifnull(P,0),0))
Неактивен
Огромное спасибо! Заработало корректно с одной поправкой
SELECT date(DateTime) as DatTime,
AVG(if(ModuleN=1,ifnull(P,0),NULL)) as Module1_AVGP, ......, AVG(if(ModuleN=9,ifnull(P,0),NULL)) as Module9_AVGP
FROM datalog where
DateTime between str_to_date('2016-08-18 00:00:00', '%Y-%m-%d %H:%i:%s')
and str_to_date('2016-08-30 00:00:00', '%Y-%m-%d %H:%i:%s') GROUP BY DatTime;
Потому что AVG(if(ModuleN=1,ifnull(P,0),0)) в случае проверки давал среднее арифметическое с расчетом,что если не ModuleN=1,то все мощности равны 0. Итого получалось неверное значение.
Отредактированно Antonioni (03.11.2016 08:22:21)
Неактивен
Страниц: 1