Это проблема пробелов и островков. Вам необходимо определить группы смежных строк. В этом случае, я думаю, самый простой метод - это разница номеров строк:
select rv.*,
row_number() over (partition by index, (seqnum - seqnum_2) order by time) as row_num
from (select t.*,
row_number() over (order by time) as seqnum,
row_number() over (partition by index order by time) as seqnum_2
from tbl t
) rv;
Почему это работает, немного сложно объяснить. Если вы посмотрите на результаты подзапроса, вы увидите, как различие между двумя значениями номеров строк определяет смежные значения, которые являются одинаковыми.
Кроме того, вы не должны использовать имена, такие как time
и index
для столбцов, потому что это ключевые слова в SQL. Я не избежал имен в приведенном выше запросе. Я призываю вас дать имена столбцам и таблицам, которые не нужно экранировать.