Выбрать последнее значение в сутках за квартал
Доброго времени суток! У меня снова задача глобальных масштабов. А именно, мне из базы заббикса нужно выгрузить аптаймы машин за квартал, значения на каждый день для каждой машины. По графику забикса видно, что последнее большое значение в сутках отправленное агентом и есть примерный аптайм машины за этот день(ну или примерно так). В таблицах я разобрался и нашел нужные значения, но проблема в том, что по запросу, который я делаю выгружаются все значения за определенный период, а мне нужно только последнее большое значение в каждых сутках в периоде для каждой машины. Я бы мог выгрузить и так, а потом как-то через powershell обработать, но машин 27750 и данных за одни сутки получается ~100 мегабайт, запрос на квартал уходит в длительные раздумья с высокой утилизацией ресурсов сервера. Поэтому нужно выбрать нужные значения с помощью запроса.
Мой запрос
Код:
SELECT tr.itemid, FROM_UNIXTIME(tr.clock) as date, tr.clock as unixtime,sec_to_time(tr.value_avg) as uptime, tr.value_avg, hs.hostid, hs.host, gr.groupid Получаю такой результат
В списке много машин, но для примера небольшой кусок, где только одна машина Код:
itemid date unixtime uptime value_avg hostid host groupid Буду рад любой подсказке! |
видимо вместо zabbix.trends тоже нужен временный набор из неё с дополнительным полем даты DATE(FROM_UNIXTIME(clock)) по которому всё группировать и делать поле MAX(value_avg) в общем наборе.
|
Добавил часовые пояса и стало немного проще. То есть не нужно ловить самое большое значение в сутках, а просто последнее значение для каждой машины в сутках. Как-то нужно по хитрому сгруппировать сначала по компам и дням, а потом выбрать последние значения. МБ как-то:
Код:
group by WEEKDAY(date_add_tmz), hostid; Пока такой запрос получился
Код:
SELECT tr.itemid, Ответ
Код:
itemid,date,date_add_tmz,timezone,unixtime,unix_add_tmz,uptime,value_avg,hostid,host,groupid |
не, идея примерно такая
Скрытый текст
Код:
SELECT tr.itemid, tr.real_date, MAX(tr.value_avg) as max_avg, tr.date, tr.unixtime, tr.uptime, tr.value_avg, hs.hostid, hs.host, gr.groupid группировать по вычисляемому полю вроде нельзя, по крайней мере в 5.7. Если было бы поле только даты в таблице, то другое дело. |
Цитата:
Скрытый текст
Код:
SELECT tr.itemid, Код:
SELECT * FROM zabbix.uptime_tt; получуаю
Код:
itemid date datetime date_add_tmz datetime_add_tmz timezone unixtime unix_add_tmz uptime value_avg hostid host groupid Скрытый текст
Код:
SELECT host, |
Осталось перевернуть таблицу, что имена столбцов были даты, первый столбец хост, остальные аптаймы по датам.
Таблица
Код:
host date uptime uptime_sec |
Собрал все в один запрос, но если у вас база большая как у меня 500gb+, то ждите, что вылетят все алерты на время выполнения, начнут ложно срабатывать триггеры, так же сработают действия с триггеров.
Конечный запрос
Код:
select up.PC as host, По перестройке таблицы пока решения не нашел. |
Время: 21:45. |
Время: 21:45.
© OSzone.net 2001-