Группировка временных меток вместе по интервалу и подсчет разницы в секундах - PullRequest
1 голос
/ 03 апреля 2019

У меня есть таблица журналов, в которой записываются различные данные.Иногда для каждой временной отметки создается несколько строк, а иногда может пройти несколько секунд, прежде чем в таблицу попадет больше записей журнала.То, что я хотел бы сделать, это сгруппировать записи, которые находятся, скажем, в пределах 2-3 минут друг от друга и подсчитать разницу в секундах этих двух записей.И, если возможно, выберите самую популярную «категорию».

Я действительно не уверен, как это сделать, но говорю, что мои данные примерно такие:

datetime                message                        category
2019-04-03 12:30:00     etc/bar/x did something        b
2019-04-03 12:30:00     there was a failure            b
2019-04-03 12:30:01     xyz is corrupt                 a
2019-04-03 12:31:00     something different            a
2019-04-03 12:31:00     drive on mnt/x is full         c
2019-04-03 12:31:00     extra info                     b
2019-04-03 12:31:05     /etc/bar/foo did something     c
2019-04-03 12:40:01     foo output x                   a
2019-04-03 12:41:30     another message                a

Что я хотел бы получить:

Total time     category
00:01:05       b         # Note this is 1 min, 5 secs, not 1:05am!
00:01:29       a         # Note this is 1 min 29 secs, not 1:29am!

Где первый столбец - чч: мм: сс (не метка времени, а отсчет времени, поэтому 1 мин 5 с).Любые идеи о том, как атаковать это?

Или, в качестве альтернативы, я рад просто получить низкое и высокое время, например:

Time between              avg category
2019-04-03 12:30:00       b                      # Note this is the start timestamp, 12:30:00pm
2019-04-03 12:31:05       c                      # Note this is the end timestamp, 12:31:05pm
2019-04-03 12:40:01       a
2019-04-03 12:41:30       a

1 Ответ

1 голос
/ 03 апреля 2019

Для первого вывода вы можете попробовать этот запрос:

SELECT SEC_TO_TIME(TIME_TO_SEC(MAX(timestamp))-TIME_TO_SEC(MIN(timestamp))) AS "Total Time",
Category FROM your_table GROUP BY category;

, в результате чего TIME_TO_SEC преобразует ваше значение TIME в общее количество секунд.Таким образом, MAX(timestamp) минус MIN(timestamp) значение для каждой категории (оба были преобразованы в значение в секундах).Затем результат этого преобразовывается обратно во времени с помощью операции SEC_TO_TIME.Поэтому вы получите Total Time в формате чч: мм: сс.

Для второго вывода вы можете попробовать этот запрос:

SELECT MIN(timestamp) AS "Timestamp",category 
FROM your_table GROUP BY category UNION 
SELECT MAX(timestamp) AS "Timestamp",category 
FROM your_table GROUP BY category ORDER BY category;

Получение значения MIN(timestamp)верх запроса объединения и значение MAX(timestamp) ниже.Закончено ORDER BY category.

Если у вас есть DATE столбцов и вы хотите разделить каждую категорию по дате, вы просто добавляете столбец в свой выбор и группируете по.Например:

SELECT Date,
SEC_TO_TIME(TIME_TO_SEC(MAX(timestamp))-TIME_TO_SEC(MIN(timestamp))) AS "Total Time",
Category FROM your_table GROUP BY date,category;

И

SELECT Date,MIN(timestamp) AS "Timestamp",category 
FROM your_table GROUP BY category UNION 
SELECT Date,MAX(timestamp) AS "Timestamp",category 
FROM your_table GROUP BY Date,category ORDER BY date,category;

РЕДАКТИРОВАТЬ: Попробуйте этот запрос ниже:

SELECT * FROM 
(SELECT * FROM your_table 
WHERE category="b" 
GROUP BY DATE(timestamp),UNIX_TIMESTAMP(timestamp) DIV 180) sub1 
LEFT JOIN
(SELECT * FROM your_table WHERE category="b") sub2 
ON sub1.category=sub2.category AND DATE(sub1.timestamp)=DATE(sub2.timestamp) 
AND sub1.timestamp<>sub2.timestamp
AND sub2.timestamp BETWEEN sub1.timestamp AND sub1.timestamp + INTERVAL 3 MINUTE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...