Судя по ответу на мой вопрос в комментариях, я не думаю, что моя идея сработала бы. так как вы упомянули, что это можно (и я полагаю, вы знаете, как это сделать) с помощью объединений, у меня была идея минимизировать количество строк, которые нужно объединить, сохраняя только диапазоны, принадлежащие различным точкам, как показано ниже:
select start, max(end) as end
from (
select min(start) as start,end
from table
group by end
) in_tab
group by in_tab.start
вышеуказанный внутренний выбор гарантирует, что ни одна конечная точка не повторяется, и выбирает самую длинную начальную точку для каждого конца. внешний выбор делает только наоборот. в итоге мы получаем диапазоны, которые начинаются и заканчиваются в разных точках (с полным удалением или полным перекрытием диапазона).
Это могло бы сработать, если бы максимальный диапазон не был большим. если бы это были даты, и существует максимальная разница в году между самой низкой датой во всей таблице и самой высокой датой в ней, тогда было бы 365 * 364 вариантов выбора любых двух точек, и это было бы более высоким пределом для возможных строк после вышеизложенного выберите. затем их можно было бы использовать во временной таблице, используя метод соединения, который у вас уже есть. но с числами, которые вы упомянули, теоретически у нас есть огромное число, которое делает эту попытку неуместной. даже несмотря на то, что приведенное выше сводит к минимуму строки, которые будут использоваться в вычислениях, их все равно будет слишком много для использования в объединении.
Я не знаю, как сделать это в ANSI SQL без объединений, если в СУБД нет других нестандартных функций. например, в оракуле это может быть легко достигнуто с помощью аналитических функций. в этом случае лучше всего использовать вышеуказанное, чтобы минимизировать количество используемых строк и перенести их в ваше приложение, и там вы можете написать код, который вычисляет диапазоны и вставить их обратно в базу данных.