SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.11.2016 16:47:02

Antonioni
Участник
Зарегистрирован: 02.11.2016
Сообщений: 4

Помогите со сложным запросом по сходным параметрам к одной таблице

Доброго дня!

Имею совсем небольшой опыт 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`;

Как это сделать для всех установок?
Дата начала и конца наблюдения переменные, объявляемые извне.

Заранее спасибо!

Неактивен

 

#2 02.11.2016 16:52:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

SELECT date(DateTime) as DatTime, ModuleN, AVG(P) 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, ModuleN;

Неактивен

 

#3 02.11.2016 17:00:04

Antonioni
Участник
Зарегистрирован: 02.11.2016
Сообщений: 4

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

Спасибо!

Сейчас понял,что неверно поставил задачу...

Необходим вывод в таблицу

+---------+---------------------+--------------------+--------------------+--------+---------------------+
| Дата     | 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`;

Неактивен

 

#4 02.11.2016 17:05:30

Antonioni
Участник
Зарегистрирован: 02.11.2016
Сообщений: 4

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

И при этом какие то значения могут быть NULL

Неактивен

 

#5 02.11.2016 17:06:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

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;

Неактивен

 

#6 02.11.2016 17:08:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

Antonioni написал:

И при этом какие то значения могут быть NULL

тогда
AVG(if(ModuleN=9,ifnull(P,0),0))

Неактивен

 

#7 03.11.2016 08:21:53

Antonioni
Участник
Зарегистрирован: 02.11.2016
Сообщений: 4

Re: Помогите со сложным запросом по сходным параметрам к одной таблице

Огромное спасибо! Заработало корректно с одной поправкой

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)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson