В следующем примере используется та же идея, что и в ответе Адама Муша, но он получает начало и конец наборов журналирования в одном выборе, который присоединяется к оператору журналирования, а не в скалярных подзапросах.
Я не думаю, что DENSE_RANK () может использоваться более напрямую, потому что нет столбца, доступного для раздела.
Кроме того, любое из этих решений предполагает, что никогда не будет перекрывающихся наборов журналов. Если второй сет начинается до того, как закончится первый, это совершенно новая проблема ...
WITH logging_sets AS
(SELECT DENSE_RANK () OVER (ORDER BY start_date) AS set_rank, start_date, end_date
FROM (SELECT CASE msg
WHEN 'Job End'
THEN NULL
ELSE LEAD (log_dt, 1, NULL) OVER (ORDER BY log_dt)
END AS end_date, log_dt AS start_date, msg
FROM logging_table lt
WHERE msg IN ('Job Start', 'Job End') )
WHERE msg = 'Job Start')
SELECT ls.set_rank, lt.ID, lt.msg, lt.log_dt
FROM logging_table lt, logging_sets ls
WHERE lt.log_dt > ls.start_date AND lt.log_dt < ls.end_date
AND msg NOT IN ('Job Start', 'Job End')
ORDER BY ls.set_rank, lt.log_dt;