![]() |
|
Найти "дырки" в последовательности | ☑ | ||
---|---|---|---|---|
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
|
Методика в https://habr.com/ru/articles/270573/
|
|||
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)) КАК ПравоеЗначение |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |