Выбрать ПЕРВЫЕ n в запросе

1. shaykhelov 17.10.13 10:03 Сейчас в теме
Как сделать чтобы ЗАПРОС выбирал только необходимое количество строк таблицы до заполнения по условию? Например в самом языке это легко:

Нужно = 100;
Есть = 0;
	
Для Каждого СтрокаТаблица Из Таблица Цикл
	
	Есть = Есть + СтрокаТаблица.Сумма;

	Если Есть > Нужно Тогда 
		Прервать;
	КонецЕсли;
	
КонецЦикла;
Показать


Сама задача. Допустим на входе ЗАПРОС получает виртуальную таблицу Партии. Необходимо выбрать первые N, но чтоб сумма была не меньше необходимого но и не избыточно лишними строками. Это нужно чтобы запрос не выбирал огромное количество строк партий со свободными остатками, дабы оптимизировать производительность.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. brodya 17.10.13 10:51 Сейчас в теме
(1) sheriff_ibiza, простой пример
ВЫБРАТЬ
	Остатки.НомерСтроки,
	СУММА(Остатки1.Сумма) КАК Сумма
ИЗ
	Остатки КАК Остатки
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Остатки КАК Остатки1
		ПО Остатки.НомерСтроки >= Остатки1.НомерСтроки

СГРУППИРОВАТЬ ПО
	Остатки.НомерСтроки

ИМЕЮЩИЕ
	СУММА(Остатки1.Сумма) < &НеобходимаяСумма
Показать

Остатки и Остатки1 - это одна и та же таблица.
+
6. Sevens 6 17.10.13 11:02 Сейчас в теме
(5) ага, только для того что бы это сделать надо сначала получить полную таблицу остатков ;) А потом ещё и соединить саму с собой, это уже явно не будет работать быстрее ;)
+
2. Sevens 6 17.10.13 10:10 Сейчас в теме
Ну ВЫБРАТЬ ПЕРВЫЕ в запросе как раз самое то, вот только ваше N надо расчитать :), а расчитать его можно только после выполнения запроса... не задача...
+
3. shaykhelov 17.10.13 10:20 Сейчас в теме
Вот и я голову вчера весь день ломал. Допустим есть 100 партий и у каждого по 10 свободного количество, а мне нужно списать только 25. В итоге нужно чтоб выбиралось только первые 3 партии. Пока не знаю как.
+
4. Sevens 6 17.10.13 10:38 Сейчас в теме
(3) sheriff_ibiza,В принципе задачу решить можно, но я сильно сомневаюсь что решение задачи приведёт к оптимизации, а не наоборот к торможению.
Так как вы изначально не знаете сколько у вас партий с остатками, и не знаете с какими ;)
+
7. juntatalor 63 17.10.13 11:31 Сейчас в теме
Желание все всегда решить запросом порочно (проверено на своем опыте).
Можно потратить кучу времени, написать еле-работающего монстра, и в итоге за 10 минут сделать все тоже самое на встроенном языке.
+
8. AllexSoft 17.10.13 11:40 Сейчас в теме
кое что действительно не нужно делать запросом...вот например в твоем случае это надо делать циклом в выборке результата... и не надо пытаться впихнуть это в запрос, он предназначен для получения массива данных, а не для обработки этого массива
+
9. KRolexx 27.04.17 12:07 Сейчас в теме
Вот как сделал я. Если вдруг кому понадобится
"ВЫБРАТЬ Первые " + стр.Количество + " ТЗ.Город,
	|ТЗ.Контрагент,
	|ТЗ.КГ,
	|ТЗ.Используется
	|ИЗ
	|Документ.Br_ВыпечаткаАнкет.ТЗ КАК ТЗ
	|ГДЕ
	|ТЗ.Город=&Город
	|И ТЗ.Используется=ЛОЖЬ
	|//Условие1//
	|//Условие2//
	|//Условие3//
	|";
	//////////////////////////////////////////////////
	Запрос.УстановитьПараметр("Город", стр.Город);
Показать
MegasXXX; +1
10. sommid 27.04.17 12:33 Сейчас в теме
при таких условиях не Первые нужно, а нужно рассчитать поле с нарастающим итогом и делать отбор по этому полю.
Таблица
1. Партия1 Кол=10 Нараст = 0
2. Партия2 Кол=10 Нараст = 10
3. Партия3 Кол=10 Нараст = 20
4. Партия4 Кол=10 Нараст = 30
Условие
Где Нараст < &Ограничение

Погуглите про получение нарастающего итога в запросе
+
11. shaykhelov 17.12.21 16:56 Сейчас в теме
вопрос актуален!
возможно процессор скд включил какие либо новые механизмы?
+
Внимание! Тема сдана в архив

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