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

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

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

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

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

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

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

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

ВЫБРАТЬ
    47,
    52
;

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

ОБЪЕДИНИТЬ

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

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

ОБЪЕДИНИТЬ

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

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

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

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

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