Вход | Регистрация
 

Вычитание диапазонов в запросе

Вычитание диапазонов в запросе
Я
   d546
 
10.08.21 - 11:45
Есть исходный диапазон 1-99
Есть еще два 15-30 и 47-52, которые надо вычесть
Должно получить 1-14, 31-46, 53-99

Как это собрать в запросе?
   Малыш Джон
 
1 - 10.08.21 - 11:53
(0) >>Как это собрать в запросе?

По-тупому или по-умному?
   Галахад
 
2 - 10.08.21 - 11:56
О чем вообще речь?
   d546
 
3 - 10.08.21 - 11:57
(1) По умному
вычитаемых диапазонов может быть несколько, но они точно не пересекаются
   d546
 
4 - 10.08.21 - 12:24
(2) Есть таблица остатков диапазонов и есть еще одна таблица с диапазонами, на которые надо уменьшить диапазоны остатка
   Малыш Джон
 
5 - 10.08.21 - 12:42
(4) в каком виде таблицы?
   d546
 
6 - 10.08.21 - 12:43
ВЫБРАТЬ
    1 КАК Начало,
    99 КАК Конец
ПОМЕСТИТЬ Полный
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    15 КАК Начало,
    30 КАК Конец
ПОМЕСТИТЬ Исключение

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    47,
    52
;
   d546
 
7 - 10.08.21 - 12:43
В таком виде
   Малыш Джон
 
8 - 10.08.21 - 13:10
(7)  

Что то типо такого, НО!! граничные случаи не предусматривал и пересекающихся отрезков тоже, лень думать:

ВЫБРАТЬ
    1 КАК Начало,
    99 КАК Конец
ПОМЕСТИТЬ Полный
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    15 КАК Начало,
    30 КАК Конец
ПОМЕСТИТЬ Исключение

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    47,
    52
;
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Исключение.Конец + 1 КАК Начало
ПОМЕСТИТЬ ВТ_НачалаОтрезков
ИЗ
    Исключение КАК Исключение

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Полный.Начало
ИЗ
    Полный КАК Полный
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Исключение.Конец
ПОМЕСТИТЬ ВТ_КонцыОтрезков
ИЗ
    Исключение КАК Исключение

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Полный.Конец
ИЗ
    Полный КАК Полный
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_НачалаОтрезков.Начало КАК Начало,
    МИНИМУМ(ВТ_КонцыОтрезков.Конец) КАК Конец
ПОМЕСТИТЬ ВТ_НаложениеОтрезков
ИЗ
    ВТ_НачалаОтрезков КАК ВТ_НачалаОтрезков
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КонцыОтрезков КАК ВТ_КонцыОтрезков
        ПО ВТ_НачалаОтрезков.Начало < ВТ_КонцыОтрезков.Конец

СГРУППИРОВАТЬ ПО
    ВТ_НачалаОтрезков.Начало
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_НаложениеОтрезков.Начало КАК Начало,
    ВЫБОР
        КОГДА Исключение.Начало ЕСТЬ NULL
            ТОГДА ВТ_НаложениеОтрезков.Конец
        ИНАЧЕ Исключение.Начало - 1
    КОНЕЦ КАК Конец
ИЗ
    ВТ_НаложениеОтрезков КАК ВТ_НаложениеОтрезков
        ЛЕВОЕ СОЕДИНЕНИЕ Исключение КАК Исключение
        ПО ВТ_НаложениеОтрезков.Конец = Исключение.Конец

УПОРЯДОЧИТЬ ПО
    Начало
   d546
 
9 - 10.08.21 - 13:15
Супер, спасибо большое
   Малыш Джон
 
10 - 10.08.21 - 14:08
(9) не обольщайся, судя по всему, задача учебная, а значит попросят объяснить, как оно работает
   d546
 
11 - 10.08.21 - 14:23
не учебная, мне нужна была идея
в голове появлялись начало и конца отрезка, но никак не могу сформировать мысль до конца
   acanta
 
12 - 10.08.21 - 21:29
К сожалению, не могу представить себе вот это на постгресе..

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.