Это форма проблемы пробелов и островков.Я бы порекомендовал выяснить, где происходят «перекрытия», а затем использовать кумулятивную сумму для определения групп.Совокупный max()
работает для этого:
select filename, min(mindatetime) as mindatetime,
max(maxdatetime) as maxdatetime
from (select t.*,
sum(case when prev_maxdatetime >= mindatetime then 0 else 1 end) over
(partition by filename order by mindatetime) as grp
from (select t.*,
max(maxdatetime) over
(partition by filename
order by mindatetime
rows between unbounded preceding and 1 preceding
) as prev_maxdatetime
from t
) t
) t
group by filename, grp;
Самый внутренний подзапрос определяет, где начинается непересекающийся диапазон времени.Затем средний запрос выполняет кумулятивную сумму этих «запусков», чтобы назначить групповой идентификатор каждой группе.Внешний запрос затем агрегируется по этой группе (и имени файла).
Вы можете выполнить внутренние запросы и посмотреть, какие значения они генерируют.
Здесь - это дБ <> скрипка.Насколько я понимаю, это работает правильно в соответствии с вопросом, который вы задали здесь .Если у вас есть временная задержка, когда вы хотите считать значения одинаковыми / перекрывающимися, задайте новый вопрос с четким объяснением вашей логики.
РЕДАКТИРОВАТЬ:
Если вы хотите одну запись для каждого имени файла, просто используйте агрегирование:
select filename, min(mindatetime) as mindatetime,
max(maxdatetime) as maxdatetime
from t
group by filename;
Первая версия объединяет строки, между которыми нет пробелов.Это просто занимает самую раннюю и последнюю дату / время.