Имя: Пароль:
1C
 
Найти "дырки" в последовательности
0 Nerevar86
 
31.10.23
10:51
Добрый день, уважаемые форумчане. Получил задачу.
Дана последовательность чисел.
Нужен запрос, который вернет код начала "дырки"
код окончания "дырки"
количество пропущенных.
Пример:
1,2,4,5,9
Результат запроса:
3-3-1
6-8-3
Пробовал свои "костыли" с левыми джоинами, но что-то совсем не то выходит...
1 АгентБезопасной Нацио
 
31.10.23
10:55
написать запрос за вас?
2 Donkey_hot
 
31.10.23
11:01
(0) Я бы делал наверное так:
- создать при помощи АВТОНОМЕРЗАПИСИ() табличку вида:
1 1
2 2
3 4
4 5
5 9
- соединить ее саму с собой по условию:
НомерСтроки2 = НомерСтроки1 + 1
- ну и собственно вывести все нужные поля для записей, где разница чисел больше 1.
3 Гена
 
гуру
31.10.23
11:13
(0) Дана арифметическая последовательность натуральных чисел?
4 KJlag
 
31.10.23
11:16
(3) думаешь там еще будут иррациональные и комплексные?
5 Zapal
 
31.10.23
11:17
(0) я тебе подскажу решение, но думаю ты не осилишь

делаешь табличку с номерами и 0-0-1-0-0-1-1-1-0
группируешь и получаешь всё нужное
6 KJlag
 
31.10.23
11:20
(0) а вообще как вариант,
для каждого числа X из последовательности найти максимальное число Y из этой же последовательности, где  Y<X.
и если X-Y>1 - вот тебе дырка.
7 Гена
 
гуру
31.10.23
11:21
(4) Ну... вдруг задана таблично какая-то последовательность чисел и отдельно вторая с пропусками...
8 NorthWind
 
31.10.23
11:22
(4) скорее всего, имеется в виду, отсортирована она по возрастанию или нет. Похоже, тут из условия задачи очевидно, что да. Рабочее решение в (2), мне кажется.
9 Гена
 
гуру
31.10.23
11:23
(5) Согласен. Так проще и красивее.
10 АгентБезопасной Нацио
 
31.10.23
11:25
(8) так у тебя же все сдвинутся после первой дырки? или я чего-то не понял?
11 NorthWind
 
31.10.23
11:36
Ну смотри. Нумеруем исходный массив, добавляя колонку код

1 1
2 2
3 4
4 5
5 9

Теперь соединяем его сам с собой по принципу код 2 = код 1 + 1

1 1 2 2
2 2 3 4
3 4 4 5
4 5 5 9
5 9 - -

Извлекаем только те записи, где колонка4 - колонка2 > 1

2 2 3 4
4 5 5 9

Далее понятно...
12 Гена
 
гуру
31.10.23
11:36
(11) А чем (5) не нравится? Сначала прогнать всю полную последовательность на предмет наличия элемента в неполной. Да/нет. А далее понятно.
13 Donkey_hot
 
31.10.23
11:38
(12) А если "ширина" дырок будет измеряться миллиардами?
14 Гена
 
гуру
31.10.23
11:39
(13) Тогда (5) плоховато.
15 Zapal
 
31.10.23
11:41
(5) не, так просто не сгруппируешь
для каждой дырки надо найти допустим меньший максимум недырки и по нему группировать
короче забей, сложно
16 Гена
 
гуру
31.10.23
12:01
(15) А чего сложного?
Циклом перебираем
0-0-1-0-0-1-1-1-0..., зная при этом
a1-a2-a3-a4-a5-a6-a7-a8-a9

Находим первую единичку, соответствует a3, продолжаем. Дальше 0 - тормозим и выводим
a3 - a3 - 1

Далее нули вплоть до 6-й позиции. Пока единичка - счётчик. На девятой позиции 0 - тормозим и выводим:
a6 - a8 - 3

В общем виде метод годится для любой возрастающей последовательности.
17 Donkey_hot
 
31.10.23
12:10
(16) Запросом вроде ТС просил... Поскольку он все равно из беседы выпал, приведу полный запрос (на эффективность условия соединения не претендую):

ВЫБРАТЬ
    АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
    ТЗ.Число КАК Число
ПОМЕСТИТЬ ПронумерованныеЧисла
ИЗ
    &ТаблицаЧисел КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПронумерованныеЧисла1.Число + 1 КАК НачалоДырки,
    ПронумерованныеЧисла2.Число - 1 КАК КонецДырки,
    ПронумерованныеЧисла2.Число - ПронумерованныеЧисла1.Число - 1 КАК ШиринаДырки
ИЗ
    ПронумерованныеЧисла КАК ПронумерованныеЧисла1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПронумерованныеЧисла КАК ПронумерованныеЧисла2
        ПО (ПронумерованныеЧисла1.НомерСтроки + 1 = ПронумерованныеЧисла2.НомерСтроки)
            И (ПронумерованныеЧисла2.Число - ПронумерованныеЧисла1.Число > 1)
18 Nerevar86
 
31.10.23
14:02
Я пробовал соединять таблицы сами с собой по святи т1.поле = т2.поле + 1 левым соединением
19 trad
 
31.10.23
14:32
select
  max(t2.n)+1 hole_begin,
  t1.n-1 hole_end,
  t1.n-max(t2.n)-1 missed
from @tab t1
left join @tab t2 on t2.n < t1.n
group by t1.n
having t1.n > max(t2.n)+1
20 Лирик
 
31.10.23
14:37
ВЫБРАТЬ
    Таблица.СуммаУпр КАК ЗначениеТаблицы
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
    &ИсходнаяТаблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИсходнаяТаблица.ЗначениеТаблицы КАК ЛевоеЗначение,
    МИНИМУМ(ЕСТЬNULL(ИсходнаяТаблица1.ЗначениеТаблицы, 0)) КАК ПравоеЗначение
ПОМЕСТИТЬ Разницы
ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица1
        ПО ИсходнаяТаблица.ЗначениеТаблицы <= ИсходнаяТаблица1.ЗначениеТаблицы

СГРУППИРОВАТЬ ПО
    ИсходнаяТаблица.ЗначениеТаблицы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Разницы.ЛевоеЗначение КАК НачалоДырки,
    Разницы.ПравоеЗначение КАК КонецДырки,
    Разницы.ПравоеЗначение - Разницы.ЛевоеЗначение КАК РазмерДырки
ИЗ
    Разницы КАК Разницы
ГДЕ
    Разницы.ЛевоеЗначение <> Разницы.ПравоеЗначение
    И Разницы.ПравоеЗначение <> 0
21 Лирик
 
31.10.23
14:42
(20) Виноват, условие соединения таблиц
ПО (ИсходнаяТаблица.ЗначениеТаблицы <= ИсходнаяТаблица1.ЗначениеТаблицы - 1)
22 Garykom
 
гуру
31.10.23
14:45
23 Garykom
 
гуру
31.10.23
14:53
(22)+ важно что исходная табличка (последовательность) не должна иметь дублей
24 Nerevar86
 
31.10.23
19:47
(21) Все бы хорошо но только запрос возвращает не коды, которых нет.
Если так делать конечно
ВЫБРАТЬ
    Таблица.СуммаУпр КАК ЗначениеТаблицы
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
    &ИсходнаяТаблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИсходнаяТаблица.ЗначениеТаблицы КАК ЛевоеЗначение,
    МИНИМУМ(ЕСТЬNULL(ИсходнаяТаблица1.ЗначениеТаблицы, 0)) КАК ПравоеЗначение
ПОМЕСТИТЬ Разницы
ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица1
        ПО (ИсходнаяТаблица.ЗначениеТаблицы <= ИсходнаяТаблица1.ЗначениеТаблицы - 1)
СГРУППИРОВАТЬ ПО
    ИсходнаяТаблица.ЗначениеТаблицы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Разницы.ЛевоеЗначение + 1 КАК НачалоДырки,
    Разницы.ПравоеЗначение  - 1 КАК КонецДырки,
    Разницы.ПравоеЗначение - 1 - Разницы.ЛевоеЗначение КАК РазмерДырки
ИЗ
    Разницы КАК Разницы
ГДЕ
    Разницы.ЛевоеЗначение <> Разницы.ПравоеЗначение
    И Разницы.ПравоеЗначение <> 0  
    И Разницы.ПравоеЗначение - Разницы.ЛевоеЗначение > 1
То выведет как надо, но это типо подогнал под ответ...
25 Волшебник
 
31.10.23
19:55
(24)  >> типо подогнал под ответ...

Халтура
26 Лирик
 
01.11.23
09:06
(24) Ничего не понимаю. Какие коды? Дана задача найти интервалы между элементами ряда чисел, где разница между соседними числами более чем какая то единица. Привел пример запроса который решает задачу. Да, с первого раза, вынырнув из своей работы не очень точно, но механизм (направление) показал. Если хотите вот более универсальное решение.
ВЫБРАТЬ
    Таблица.СуммаУпр КАК ЗначениеТаблицы
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
    &ИсходнаяТаблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИсходнаяТаблица.ЗначениеТаблицы КАК ЛевоеЗначение,
    МИНИМУМ(ИсходнаяТаблица1.ЗначениеТаблицы) КАК ПравоеЗначение
ПОМЕСТИТЬ Интервалы
ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица1
        ПО ИсходнаяТаблица.ЗначениеТаблицы < ИсходнаяТаблица1.ЗначениеТаблицы

СГРУППИРОВАТЬ ПО
    ИсходнаяТаблица.ЗначениеТаблицы
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Интервалы.ЛевоеЗначение КАК НачалоИнтервала,
    Интервалы.ПравоеЗначение КАК КонецИнтервала,
    Интервалы.ПравоеЗначение - Интервалы.ЛевоеЗначение КАК РазмерИнтервала
ИЗ
    Интервалы КАК Интервалы
ГДЕ
    Интервалы.ПравоеЗначение - Интервалы.ЛевоеЗначение > &ШагИнтервала

Параметр "ШагИнтервала" должен быть больше 0.
27 Лирик
 
01.11.23
09:13
(26) Ну и да, опять забыл обернуть в есть нулл
МИНИМУМ(ЕСТЬNULL(ИсходнаяТаблица1.ЗначениеТаблицы, 0)) КАК ПравоеЗначение
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой