|
|
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Помогите, плиз, реализовать в MySQL следующее: Есть 2 похожие таблицы: Дата_Время; Показатель Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Мне необходимо выбирать данные и строить график (два в одном), но так как метки времени не совпадают, при построении графиков есть проблемы. В качестве решения хочу добавить таблицу с эталонными временными интервалами (с 00:00 по 23:30, через 30 мин) и строить графики опираясь на них, а значения из таблиц выбирать и рассчитывать среднее или скользящее среднее. Хотел написать соответствующую хранимую функцию или с использованием вложенных подзапросов, но запутался в синтаксисе для mysql (привык к ms sql). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 07:28:03 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 08:55:18 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Спасибо, но это не подходит, т.к. сначала выводит все значения первой таблицы, потом второй. А мне надо привязать к единой временной шкале и желательно взять усредненные значения. В таблицах фактически лежат показания с датчиков температуры в разных точках их надо отобразить на общем графике для наглядности. Как я и говорил - добавил таблицу 'timemaster', там лежат метки времени: 00:00, 00:30, 01:00, 01:30 и т.д. Я пишу примерно следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Естественно, что это выдает только те строки, где время полностью совпало. Поэтому я и хочу изменить условия так, что бы на каждую запись таблицы 'timemaster' выбиралось 3 ближайших значения таблицы 'data', а значение температуры при этом бралось среднее. В ms sql я бы написал функцию и вставил бы в селект, тут у меня это не получается, скорее всего из за того что не могу разобраться в синтаксисе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 10:17:18 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVSсначала выводит все значения первой таблицы, потом второй.Ну членовню-то не пори, да... AlexanderVSжелательно взять усредненные значения.Тогда только дополнительная опорная таблица, возможно динамическая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 11:49:32 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Можно хоть краткий пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 14:48:11 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Нет, друг мой, это с тебя сначала DDL таблиц и DML из наполнения данными. А потом будут тебе примеры - причём вот прям на твоих же таблицах и данных. Да, кириллицу нахрен, равно как и лишнюю шелужу в DDL-ках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 15:51:54 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
В аттаче скриншот того, как выглядят графики сейчас и 3 таблички: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 22:26:18 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
лично меня учытель арыфметики учил так бить на интервалы t1(dt,val) t2(dt,val) SELECT IFNULL(r1.period,r2.period),ifnull(r1.val,'none'),ifnull(r2.val,'none') FROM ( select time(floor((unix_timestamp(dt)-unix_timestamp(date(dt)))/60/30)*60*30) as 'period',avg(val) from t1 group by `period`) r1 FULL OUTER JOIN ( select time(floor((unix_timestamp(dt)-unix_timestamp(date(dt)))/60/30)*60*30) as 'period',avg(val) from t2 group by `period`) r2 ON(r1.period = r2.period) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2014, 23:23:31 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVS, 1. в таблице еталонного времени сделайте интервалы: d_start, d_end 00:00:00, 00:30:00 00:30:00, 01:00:00 01:00:00, 01:30:00 ......... 2. сам запрос будет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 3. вторую таблицу в одном запросе можно подсоединить несколькими способами. но проше сделать второй запрос. 4. "Сглаживаюшее" "бегущее" среднее по соседним точкам -- возможно на переменных -- довольно громоздко и точно не в Пятницу вечером... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2014, 00:18:16 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
javajdbc, Спасибо, не плохой вариант. Но все же если есть возможность, примерчик со скользящим средним мне б сильно помог :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 09:18:06 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Akina, Я выложил структуру и данные, можно надеяться на помощь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 19:14:39 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVSAkina, Я выложил структуру и данные, можно надеяться на помощь? Что касается задачи без опорной таблицы - достаточно адаптировать текст моего запроса, подставив соотв. имена полей и таблиц. Код: sql 1. 2. 3. 4. Ну, если очень хочется, мжно добавить сортировку конечного набора по полю даты-времени Код: sql 1. 2. 3. 4. 5. Если добавить опорную таблицу времён и гарантировать её "30-минутную дискретность", то получится Код: sql 1. 2. 3. 4. 5. 6. А для произвольной таблицы опорных времён сам в подзапросе трансформируешь её в таблицу вида start-end и перепишешь соотв. образом условия связывания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 21:15:49 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVSjavajdbc, Спасибо, не плохой вариант. Но все же если есть возможность, примерчик со скользящим средним мне б сильно помог :) Ну например: http://www.onlamp.com/pub/a/mysql/2007/04/12/emulating-analytic-aka-ranking-functions-with-mysql.html?page=3 Было еще пару статеек -- не смог быстро найти -- но в результате легче поставить Оракле Експресс :-) Идея такая: если надо бегушее окно из 3 записей,то задается 3 переменные и в них FILO хороводом записывается следуюшee значение и усредняется, потом на следуюшей записи последнее выкидывается и усредняется 2 предпоследних и текушая запись... хоровод переменных -- занудство и легко ошибится. Если надо окно из 5 -- надо тянуть 5 переменных, итд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 03:38:27 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Akina, javajdbc Спасибо, буду разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 06:46:11 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
javajdbcAlexanderVSjavajdbc, Спасибо, не плохой вариант. Но все же если есть возможность, примерчик со скользящим средним мне б сильно помог :) Было еще пару статеек -- не смог быстро найти -- но в результате легче поставить Оракле Експресс :-) А с этим никак, потому как и web server и mysql крутятся на железяке QNAP-219P, и служат для сбора информации с домашних и дачных датчиков температуры, влажности, давления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 06:50:35 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVS, вот тут попроше идея: селф-жоинт с условиями связки в качестве окна. Т.е. если нужно конкретно временое окно -- данная точка плюс-минус один час, то Код: sql 1. 2. 3. 4. 5. 6. если надо по соседним точкам, то счанала надо пронумеровать все точке последовательно, а потом аналогичный СКЛ: Код: sql 1. 2. 3. 4. 5. 6. https://jonlabelle.com/snippets/view/sql/mysql-moving-average На переменных будет, скорее всего, быстрее, но путанее. Вариант -- сглаживать в сторед-процедуре Вариант -- самый простой -- сглаживать группировкой по часам -- просто прямолинейным Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 07:38:54 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
javajdbcAlexanderVS, Вариант -- самый простой -- сглаживать группировкой по часам -- просто прямолинейным Это я уже попробовал, самое грубое, но и самое простое решение :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 07:53:03 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
javajdbcAlexanderVS, Вариант -- сглаживать в сторед-процедуре Вообще я хотел сглаживать в хранимой функции с построчным вызовом в селекте (так бы я поступил в ms sql) - не получается, запутался в синтаксисе. Сглаживать в ХП: чем будет отличаться от всех перечисленных примеров, только тем что код будет оформлен в виде ХП и храниться на сервере? Ну и вызов из PHP соответственно будет мной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 08:02:35 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVSСглаживать в ХП: чем будет отличаться от всех перечисленных примеров, только тем что код будет оформлен в виде ХП и храниться на сервере?В коде ХП можно использовать "настоящие" переменные. И курсоры. По крайней мере читаться будет гораздо лучше, чем многоэтажный монстр, который вы получите, пытаясь всю логику запихнуть в один запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 08:05:30 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AkinaAlexanderVSAkina, Я выложил структуру и данные, можно надеяться на помощь? Что касается задачи без опорной таблицы - достаточно адаптировать текст моего запроса, подставив соотв. имена полей и таблиц. Если добавить опорную таблицу времён и гарантировать её "30-минутную дискретность", то получится Код: sql 1. 2. 3. 4. 5. 6. А для произвольной таблицы опорных времён сам в подзапросе трансформируешь её в таблицу вида start-end и перепишешь соотв. образом условия связывания. Почему Код: sql 1. дает значение NULL, поле tm.val - это TIME ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 10:07:38 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Вот так работает Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 10:18:17 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
AlexanderVSПочему Код: sql 1. дает значение NULL, поле tm.val - это TIME У меня никаких NULL нет. На твоих, между прочим, данных, без какой-либо модификации. Я проверял, прежде чем постить. Опять же синтаксически с учётом твойих данных - этому NULL взяться неоткуда. Вывод простой - ищи косяк у себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 10:44:48 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Akina, версия сервера не может влиять? У меня: Версия сервера: 5.1.36-log - Source distribution ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 11:03:24 |
|
||
|
Выбор данных для построения 2 графиков
|
|||
|---|---|---|---|
|
#18+
Версия - нет, в тексте запроса нет ничего версионно-специфичного. Настройки - возможно. Я пробовал на инстансе 5.6.14-log MySQL Community Server (GPL), установленном под Windows x86 как девелоперский, и все настройки оставлены по умолчанию. За исключением дефолтной кодировки (изменена на 1251) - но она не может так повлиять на результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 13:37:12 |
|
||
|
|

start [/forum/topic.php?fid=47&gotonew=1&tid=1834348]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 382ms |

| 0 / 0 |
