@Fantyk
web developer

Есть ли способ сгруппировать секунды в запросе mysql по непрерывным интервалам?

Есть следующая схема БД:

CREATE TABLE `test_resource_times` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `resource_id` int(11) NOT NULL,
  `date_timestamp` int(11) unsigned NOT NULL,
  `time_start` int(11) unsigned NOT NULL,
  `time_finish` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test_resource_times` (`resource_id`,  `date_timestamp`, `time_start`, `time_finish`)
VALUES
	(1, 1557867600, 46800, 47700),
	(1, 1557867600, 47700, 48600),
	(1, 1557867600, 48600, 49500),
	(1, 1557867600, 49500, 50400),

	(1, 1557867600, 63000, 63900),
	(1, 1557867600, 63900, 64800),
	(1, 1557867600, 64800, 65700),
	(1, 1557867600, 65700, 66600),
	(1, 1557867600, 66600, 67500),
	(1, 1557867600, 67500, 68400),
	(1, 1557867600, 68400, 69300),
	(1, 1557867600, 69300, 70200),
	(1, 1557867600, 70200, 71100);

В столбцах `time_start` и `time_finish` - секунды начала и конца интервала.
Есть ли способ сгрупировать секунды так, чтобы мне выводились непрерывные интервалы?
Чтобы результат был таким:

(1, 1557867600, 46800, 50400)
(1, 1557867600, 63000, 71100)


UPD Mysql версии 5.6
fiddle: https://www.db-fiddle.com/f/tgXM33yJEr4fS1dneTfh4K/0
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 1
@tin_vsl
Senior Developer
в общем можно сделать так
SELECT *
  FROM (
       SELECT *, LAG(time_finish) OVER (ORDER BY time_start) previous_finish_time 
         FROM test_resource_times
       ) tr_times
 WHERE previous_finish_time IS NULL
    OR previous_finish_time <> time_start


именно для 5.6 можно так
SELECT tr1.*
  FROM test_resource_times tr1
  LEFT JOIN test_resource_times tr2
    ON tr1.time_start = tr2.time_finish
 WHERE tr2.time_finish IS NULL
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы