Если я следил за вами правильно, вы имеете дело с пробелами и проблемой острова.
В чистом SQL это обычно решается с помощью оконных функций и агрегирования. Разница между номерами строк дает вам группу, к которой принадлежит каждая запись:
SELECT
category,
MIN(timestamp) start_timestap,
MAX(timestamp) end_timestap
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(ORDER BY Timestamp) rn1,
ROW_NUMBER() OVER(PARTITION BY Category ORDER BY Timestamp) rn2
FROM mytable t
) x
GROUP BY category, rn1 - rn2
ORDER BY start_timestap
В это БД Fiddle с вашими данными выборки, это возвращает:
| category | start_timestap | end_timestap |
| -------- | ------------------- | ------------------- |
| AAAA | 2019-03-22 08:10:00 | 2019-03-22 08:12:00 |
| BBBB | 2019-03-22 08:13:00 | 2019-03-22 08:14:00 |
| CCCC | 2019-03-22 08:15:00 | 2019-03-22 08:16:00 |
| AAAA | 2019-03-22 08:17:00 | 2019-03-22 08:17:00 |
Примечание: это скрипта БД MySQL 8.0, однако это стандартный ANSI SQL, который должен работать на любой платформе, поддерживающей оконные функции.