Я подозреваю, что для робота нормально сидеть на одном месте для смежных ходов.Позднее проблема возвращается к более ранней точке.
Если это так, то это пример проблемы пробелов и островков.Эту проблему можно решить с помощью различных номеров строк, чтобы получить смежные ходы, когда робот находится в заданном месте:
select spot, min(moveid) as min_moveid, max(moveid) as max_moveid
from (select m.*,
row_number() over (order by moveid) as seqnum,
row_number() over (partition by spot order by moveid) as seqnum_s
from moves m
) m
group by (seqnum - seqnum_s), spot;
Почему это работает немного сложно объяснить, но довольно легко увидеть.Если вы запустите подзапрос, вы увидите, как разность номеров строк определяет каждое пятно.
Теперь задается вопрос о диапазоне перемещений для каждого пятна - появляется ли пятно более одного раза.Для этого теперь мы можем использовать count(*)
в качестве оконной функции.Итак, чтобы получить вхождения дубликатов ходов:
with s as (
select spot, min(moveid), max(moveid)
from (select m.*,
row_number() over (order by moveid) as seqnum,
row_number() over (partition by spot order by moveid) as seqnum_s
from moves m
) m
group by (seqnum - seqnum_s), spot
)
select s.*
from (select s.*,
count(*) over (partition by spot) as cnt
from s
) s
where cnt > 1;
Я считаю, что это отвечает на ваш вопрос.