Определенние периодов в последовательности

1. skillman 5 28.03.19 20:58 Сейчас в теме
Прошу подсказать как определить периоды из списка документов у которых последовательность не нарушена, которые идут последовательно в запросе
При наличии списка документов в в последовательности 1,2, 5, 6, 7, ....
Нужно выводить в формате от
1 до 2
5 до 7
и т.д.
Для отладки вывожу список документов запросом


ВЫБРАТЬ
	РеализацияУслуг.Регистратор.Ссылка КАК РегистраторСсылка,
	ПОДСТРОКА(РеализацияУслуг.Регистратор.Номер, 6, 9) КАК НомерДокумента
ПОМЕСТИТЬ Дано
{ВЫБРАТЬ
	НомерДокумента}
ИЗ
	РегистрНакопления.РеализацияУслуг КАК РеализацияУслуг
ГДЕ
	РеализацияУслуг.Период МЕЖДУ &Дата1 И &Дата2
{УПОРЯДОЧИТЬ ПО
	НомерДокумента}
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Дано.НомерДокумента КАК НомерДокумента
ИЗ
	Дано КАК Дано
Показать


Во вложенном файле пример.
Нужна помощь именно в составлении запроса.
Прикрепленные файлы:
Новый1.xls
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. tusv 211 29.03.19 12:32 Сейчас в теме +0.1 $m
(5) Набросал свои Данные
ВЫБРАТЬ
	"00001" КАК номер
ПОМЕСТИТЬ Дано

ОБЪЕДИНИТЬ ВЫБРАТЬ "00002"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00003"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00011"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00012"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00013"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00031"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00032"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00033"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00999"
;
Показать

Воспользовался Ссылкой Приведения числа из строки из (2)
ВЫБРАТЬ
	0 КАК С,
	1 КАК П
ПОМЕСТИТЬ Р16

ОБЪЕДИНИТЬ ВЫБРАТЬ 1, 10
ОБЪЕДИНИТЬ ВЫБРАТЬ 2, 100
ОБЪЕДИНИТЬ ВЫБРАТЬ 3, 1000
ОБЪЕДИНИТЬ ВЫБРАТЬ 4, 10000
ОБЪЕДИНИТЬ ВЫБРАТЬ 5, 100000
ОБЪЕДИНИТЬ ВЫБРАТЬ 6, 1000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 7, 10000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 8, 100000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 9, 1000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 10,10000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 11,100000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 12,1000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 13,10000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 14,100000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 15,1000000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 16,10000000000000000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Значение,
	Дано.номер КАК номер
ПОМЕСТИТЬ НомераСЧислами
ИЗ
	Дано КАК Дано,
	Р16 КАК А,
	Р16 КАК Б
ГДЕ
	Б.С < 10
	И ПОДСТРОКА(Дано.номер, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
	Дано.номер
;
Показать

Собрал интервалы, как у Вас в (3)
ВЫБРАТЬ
	НомераСЧислами.Значение КАК Значение
ПОМЕСТИТЬ НачалоИнтервала
ИЗ
	НомераСЧислами КАК НомераСЧислами
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (НомераСЧислами.Значение - 1 = НомераСЧислами1.Значение)
ГДЕ
	НомераСЧислами1.Значение ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	НомераСЧислами.Значение КАК Значение
ПОМЕСТИТЬ КонецИнтервала
ИЗ
	НомераСЧислами КАК НомераСЧислами
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (НомераСЧислами.Значение + 1 = НомераСЧислами1.Значение)
ГДЕ
	НомераСЧислами1.Значение ЕСТЬ NULL
;

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

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

И добавил свое
ВЫБРАТЬ
	"с " + НомераСЧислами.номер + " по " + НомераСЧислами1.номер КАК Интервал
ИЗ
	Интервалы КАК Интервалы
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами
		ПО (Интервалы.НачалоИнтервала = НомераСЧислами.Значение)
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (Интервалы.КонецИнтерваоа = НомераСЧислами1.Значение)

УПОРЯДОЧИТЬ ПО
	Интервалы.НачалоИнтервала
Показать

Получилось
с 00001 по 00003
с 00011 по 00013
с 00031 по 00033
с 00999 по 00999
skillman; Eternal_student799; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ildarovich 7875 29.03.19 02:51 Сейчас в теме
(1) Можно взять за основу решение задачи 14 из публикации Минимализмы. Только для чисел переписать. Изменится только выражение в группировке. Станет проще. Просто сложением.
Отдельная проблема может оказаться в том, что исходные данные, судя по примеру, это не числа, а строки. Тут потребуется сначала строки в числа преобразовать. Можно взять решение отсюда: Выразить строку как число и строку как дату в запросе.
Ну, еще можно сочинить свое добавление единицы к строке. ХХХХ0 -> ХХХХ1, ..., ХХХХ8 -> ХХХХ9, ..., 09999 - > 10000. В общем, варианты есть, но задача не слишком простая.
dhurricane; +1 Ответить
3. skillman 5 29.03.19 09:59 Сейчас в теме
Спасибо.
Я пока остановился на другом решении:
ВЫБРАТЬ
	ТЗ_Чисел.Значение КАК Значение
ПОМЕСТИТЬ ТЗ_Чисел
ИЗ
	&ТЗ_Чисел КАК ТЗ_Чисел
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТЗ_Чисел.Значение КАК ЗначениеЧисло
ПОМЕСТИТЬ ВТ_ЧислаНачалаИнтервалов
ИЗ
	ТЗ_Чисел КАК ТЗ_Чисел
		ЛЕВОЕ СОЕДИНЕНИЕ ТЗ_Чисел КАК ТЗ_Чисел1
		ПО (ТЗ_Чисел.Значение - 1 = ТЗ_Чисел1.Значение)
ГДЕ
	ТЗ_Чисел1.Значение ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТЗ_Чисел.Значение КАК ЗначениеЧисло
ПОМЕСТИТЬ ВТ_ЧислаКонцаИнтервалов
ИЗ
	ТЗ_Чисел КАК ТЗ_Чисел
		ЛЕВОЕ СОЕДИНЕНИЕ ТЗ_Чисел КАК ТЗ_Чисел1
		ПО (ТЗ_Чисел.Значение + 1 = ТЗ_Чисел1.Значение)
ГДЕ
	ТЗ_Чисел1.Значение ЕСТЬ NULL
;

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


Но результат выводится не в том виде ,нужно число в строку преобразовать, чтобы склеить. Пока разбираюсь дальше
4. skillman 5 29.03.19 10:00 Сейчас в теме
Результат у меня пока в таком виде
НачалоИнтервала КонецИнтервала
1 5
7 9
12 12
15 16
5. dhurricane 29.03.19 10:06 Сейчас в теме
(4) А куда результат выводится? Формирование сложного представления - уже задача встроенного языка. Крайне редко, когда оправданно перекладывать эту задачу на язык запросов.
6. skillman 5 29.03.19 10:45 Сейчас в теме
Наверно это мое внутреннее желание добиться вывод результата запросом.
(5)
7. tusv 211 29.03.19 12:32 Сейчас в теме +0.1 $m
(5) Набросал свои Данные
ВЫБРАТЬ
	"00001" КАК номер
ПОМЕСТИТЬ Дано

ОБЪЕДИНИТЬ ВЫБРАТЬ "00002"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00003"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00011"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00012"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00013"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00031"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00032"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00033"
ОБЪЕДИНИТЬ ВЫБРАТЬ "00999"
;
Показать

Воспользовался Ссылкой Приведения числа из строки из (2)
ВЫБРАТЬ
	0 КАК С,
	1 КАК П
ПОМЕСТИТЬ Р16

ОБЪЕДИНИТЬ ВЫБРАТЬ 1, 10
ОБЪЕДИНИТЬ ВЫБРАТЬ 2, 100
ОБЪЕДИНИТЬ ВЫБРАТЬ 3, 1000
ОБЪЕДИНИТЬ ВЫБРАТЬ 4, 10000
ОБЪЕДИНИТЬ ВЫБРАТЬ 5, 100000
ОБЪЕДИНИТЬ ВЫБРАТЬ 6, 1000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 7, 10000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 8, 100000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 9, 1000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 10,10000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 11,100000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 12,1000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 13,10000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 14,100000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 15,1000000000000000
ОБЪЕДИНИТЬ ВЫБРАТЬ 16,10000000000000000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Значение,
	Дано.номер КАК номер
ПОМЕСТИТЬ НомераСЧислами
ИЗ
	Дано КАК Дано,
	Р16 КАК А,
	Р16 КАК Б
ГДЕ
	Б.С < 10
	И ПОДСТРОКА(Дано.номер, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
	Дано.номер
;
Показать

Собрал интервалы, как у Вас в (3)
ВЫБРАТЬ
	НомераСЧислами.Значение КАК Значение
ПОМЕСТИТЬ НачалоИнтервала
ИЗ
	НомераСЧислами КАК НомераСЧислами
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (НомераСЧислами.Значение - 1 = НомераСЧислами1.Значение)
ГДЕ
	НомераСЧислами1.Значение ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	НомераСЧислами.Значение КАК Значение
ПОМЕСТИТЬ КонецИнтервала
ИЗ
	НомераСЧислами КАК НомераСЧислами
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (НомераСЧислами.Значение + 1 = НомераСЧислами1.Значение)
ГДЕ
	НомераСЧислами1.Значение ЕСТЬ NULL
;

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

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

И добавил свое
ВЫБРАТЬ
	"с " + НомераСЧислами.номер + " по " + НомераСЧислами1.номер КАК Интервал
ИЗ
	Интервалы КАК Интервалы
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами
		ПО (Интервалы.НачалоИнтервала = НомераСЧислами.Значение)
		ЛЕВОЕ СОЕДИНЕНИЕ НомераСЧислами КАК НомераСЧислами1
		ПО (Интервалы.КонецИнтерваоа = НомераСЧислами1.Значение)

УПОРЯДОЧИТЬ ПО
	Интервалы.НачалоИнтервала
Показать

Получилось
с 00001 по 00003
с 00011 по 00013
с 00031 по 00033
с 00999 по 00999
skillman; Eternal_student799; +2 Ответить
8. dhurricane 29.03.19 12:53 Сейчас в теме
(7) Я надеюсь, Вы это сделали исключительно из спортивного интереса. :)
9. tusv 211 29.03.19 13:29 Сейчас в теме
(8) Нет. Для разминки. Обычно пригождается в будущем
10. skillman 5 09.05.19 17:11 Сейчас в теме
Всем спасибо, очень помогли!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот