MySQL Запрос таблицы журналов для получения измененных данных - PullRequest
1 голос
/ 08 марта 2020

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

Краткое описание: Я написал систему, которая постоянно проверяет состояние серверов, результаты 1 или 0 (true of false). Эти статусы записываются в таблицу базы данных с именем «logs». Есть несколько контролируемых систем. Теперь я хочу получить выборку из базы данных изменений состояния для каждой системы. (Только когда статус изменился, например, перешел из онлайн в автономный режим) для всего периода данных.

Структура:

Table [logs] -
logs.logs_id == mon.mon_id
logs.logs_status 
logs.logs_updated

Table [monitoring] -
mon.mon_id
mon.mon_sid
mon.....

Пример данных -

logs.logs_id | logs.logs_status | logs.logs_updated
1    1    2020/02/29 21:04:00
2    1    2020/02/29 21:04:00
3    1    2020/02/29 21:04:00
4    1    2020/02/29 21:04:00
5    1    2020/02/29 21:04:00
6    0    2020/02/29 21:04:00
1    1    2020/02/29 21:04:10
2    1    2020/02/29 21:04:10
3    1    2020/02/29 21:04:10
4    1    2020/02/29 21:04:10
5    1    2020/02/29 21:04:10
6    0    2020/02/29 21:04:10
1    1    2020/02/29 21:04:20
2    1    2020/02/29 21:04:20
3    1    2020/02/29 21:04:20
4    1    2020/02/29 21:04:20
5    1    2020/02/29 21:04:20
6    0    2020/02/29 21:04:20
1    1    2020/02/29 21:04:30
2    1    2020/02/29 21:04:30
3    1    2020/02/29 21:04:30
4    1    2020/02/29 21:04:30
5    1    2020/02/29 21:04:30
6    1    2020/02/29 21:04:30
1    1    2020/02/29 21:04:40
2    1    2020/02/29 21:04:40
3    1    2020/02/29 21:04:40
4    1    2020/02/29 21:04:40
5    1    2020/02/29 21:04:40
6    1    2020/02/29 21:04:40
1    1    2020/02/29 21:04:50
2    1    2020/02/29 21:04:50
3    1    2020/02/29 21:04:50
4    1    2020/02/29 21:04:50
5    1    2020/02/29 21:04:50
6    0    2020/02/29 21:04:50
1    1    2020/02/29 21:05:00
2    1    2020/02/29 21:05:00
3    1    2020/02/29 21:05:00
4    1    2020/02/29 21:05:00
5    0    2020/02/29 21:05:00
6    0    2020/02/29 21:05:00

На основе приведенных выше примеров я хотел бы создать SQL Запрос (MySQL База данных), который будет отображать результаты ниже -

mon.mon_sid | logs.logs_status | logs.logs_updated
YYY        0    2020/02/29 21:05:00
XXX        0    2020/02/29 21:04:50
XXX        1    2020/02/29 21:04:30
XXX        0    2020/02/29 21:04:00

Поскольку только статус log.mon_id == 6 и log.mon_id == 5 было изменено согласно данным, тогда только это должно быть возвращено. Итак, у меня будет четыре результата.

Заранее благодарю за помощь, я так измотан, что пытаюсь это выяснить. Привет, Майкл.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020
select 
    mon.mon_sid,
    mon.mon_hostname,
    mon.mon_port,
    mon.mon_display,
    logs_status AS current_status,
    previous_status,
    logs_updated
from (
    select 
        l.*,
        lag(logs_status) over(
            partition by mon_id
            order by logs_updated
        ) previous_status
    from logs l
) tmp
    INNER JOIN monitoring AS mon
    ON tmp.mon_id = mon.mon_id
where logs_status <> previous_status
ORDER BY logs_updated DESC

Это окончательная версия, основанная на @GMB Solution, еще раз спасибо @ GMB.

0 голосов
/ 08 марта 2020

Если вы используете MySQL 8.0, вы можете просто использовать lag():

select *
from (
    select 
        l.*,
        lag(logs_status) over(
            partition by logs_id 
            order by logs_updated
        ) lag_log_status
    from logs l
) t
where log_status <> lag_log_status
...