Получить несколько максимальных значений в запросе

1. Melcor16rus 19.07.19 09:09 Сейчас в теме
Добрый день. Подскажите как решить не совсем тривиальную задачку.
В запросе есть временная таблица с данными и мне необходимо получить первые несколько максимальных значений. т.е.

товар количество
Тов1 - 3
тов2 - 7
Тов3 - 10
Тов4 - 5
Тов5 - 6
Тов6 - 10
Тов7 - 1

необходимо получить 5 макс значений из этой таблицы, но если значения одинаковые, то идут как одна строка
нужно привести к след виду:

Тов1 - 3
тов2 - 7
Тов3 - 10
Тов4 - 5
Тов5 - 6
Тов6 - 10

т.к. Тов3 и Тов6 одинаковое количество, берем за одно макс значение
По теме из базы знаний
Найденные решения
47. Onwardv 64 19.07.19 11:08 Сейчас в теме
(42) Упс. подтер "Поместить ВТ_Данные" в первом пакете. Должно быть:
ВЫБРАТЬ	"Тов1" КАК Товар,	3 КАК Количество
ПОМЕСТИТЬ  ВТ_Данные
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов2",	7
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов3",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов4",	5
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов5",	6
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов6",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов7",	1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5
	ВТ_Данные.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Максимальные
ИЗ
	ВТ_Данные КАК ВТ_Данные

УПОРЯДОЧИТЬ ПО
	Количество УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Данные.Товар,
	ВТ_Данные.Количество
ИЗ
	ВТ_Данные КАК ВТ_Данные
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Максимальные КАК ВТ_Максимальные
		ПО ВТ_Данные.Количество = ВТ_Максимальные.Количество
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YannikAlx 43 19.07.19 09:18 Сейчас в теме
(1) То есть вам не важна информация Тов3 или Тов6...?
Тогда группируйте сначала по значению , свернутся одинаковые 10,
Сортируйте опять же по значяениям с убыванием и берите первые 5.
Все.....
6. Melcor16rus 19.07.19 09:21 Сейчас в теме
(2) (4) я не могу упорядочить, это будет временной таблицей
10. lefthander 19.07.19 09:23 Сейчас в теме
(6)не упорядочивайте, выбирайте все, перед выводом упорядочите и ограничите...
4. lefthander 19.07.19 09:20 Сейчас в теме
(1)Я бы как нибудь так решил эту задачу
Справочник товаров и РН остатков поменяйте на ваши значения.

ВЫБРАТЬ ПЕРВЫЕ 5
	Товары.Наименование КАК Наименование,
	СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ИЗ
	РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
		ПО (СвободныеОстаткиОстатки.Номенклатура = Товары.Ссылка)

СГРУППИРОВАТЬ ПО
	Товары.Наименование,
	СвободныеОстаткиОстатки.ВНаличииОстаток

УПОРЯДОЧИТЬ ПО
	ВНаличииОстаток УБЫВ
Показать
9. chemezov 47 19.07.19 09:22 Сейчас в теме
(4)
.ВНаличииОстаток КАК ВНаличииОстаток
ИЗ

Учитывая что виртуальная таблица "Остатки" по-умолчанию максимально сгруппирована, то группировку вы лишнюю прилепили. Можно тогда только сортировку сразу ставить.
12. lefthander 19.07.19 09:24 Сейчас в теме
(9)Да, согласен, ;)
ЗЫ Утро, кофе сварил, но еще не налил ....;))
8. laperuz 46 19.07.19 09:22 Сейчас в теме
(1)
1. Группировка по значению
2. Сортировка
3. Выбор первых 5
4. Внутреннее соединение с первоначальной таблицей по значению

UPD: не заметил, что ВТ..
36. VmvLer 19.07.19 10:27 Сейчас в теме
(1) я уже несколько раз писал как решать такие задачи без костылей если релиз платформы у вас не совсем древний.

https://forum.infostart.ru/forum9/topic219888/
3. chemezov 47 19.07.19 09:19 Сейчас в теме
Нужно именно получить 5 ссылок на товары у которых максимальное количество товара? Или нужно просто получить первые 5 цифр "КоличествоОстаток" которые будут не повторяющимися и максимальными по отношению ко всем следующим?
5. Melcor16rus 19.07.19 09:20 Сейчас в теме
Нужно получить первые 5 максимальных значений, но если какие-то значения повторяются, то значит уже не 5, а 6, как в примере выше
7. lefthander 19.07.19 09:22 Сейчас в теме
(5)Тогда мой примерчик не подойдет. ;)
13. YannikAlx 43 19.07.19 09:24 Сейчас в теме
(7) а еще вы не читаете уже выше предложенные методики и банально повторяетесь...
16. lefthander 19.07.19 09:29 Сейчас в теме
(13)посмотрите на время созданных предложений, оно практически совпадает, и когда я вставлял ответ сообщений еще не было а теме... сорри, если вас это раздражает...
17. Melcor16rus 19.07.19 09:31 Сейчас в теме
(16) Да нет, просто если бы был вариант с упорядочиванием, то я бы тему не создал, я может не семи пядей во лбу, но и не совсем тупой =)
11. Melcor16rus 19.07.19 09:24 Сейчас в теме
Я не могу УПОРЯДОЧИВАТЬ, это временная таблица для последующего левого соединения
14. lefthander 19.07.19 09:26 Сейчас в теме
(11)выполните запрос а затем поместите его в таблицу
А если хотите очень помощи, то можно было бы и запрос в студию... а то по ходу предложений вы изменяете условия...
15. laperuz 46 19.07.19 09:27 Сейчас в теме
(11)
Тупой вариант - получаем максимальное значение, потом с ним левое соединение основной таблицы с отбором по полю левой таблицы равному NULL. Дальше снова то же самое, так 5 раз. Так получим 5 таблиц с максимальными значениями. Ну а потом уже с ними соединять основную таблицу.
23. YannikAlx 43 19.07.19 09:44 Сейчас в теме
(11) к вашему сведению Временные таблицы прекрасно упорядочиваются...!!

Вот например прекрасно работает
ВЫБРАТЬ первые 1000
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.Ссылка.Наименование Как Нам
ПОМЕСТИТЬ ВТ
ИЗ
    Справочник.Контрагенты КАК Номенклатура
УПОРЯДОЧИТЬ ПО Нам Убыв
;
Показать


Вместо 1000 поставьте любое число гарантированно превышающее число ваших записей
52. kirinalex 15 26.10.20 07:47 Сейчас в теме
(23)
Кучей является таблица без кластеризованного индекса. Для таблиц, сохраненных как куча, может быть создан один или несколько некластеризованных индексов. Данные хранятся в куче без указания порядка. Обычно данные первоначально сохраняются в порядке, в котором строки вставлены в таблицу, но компонент Компонент Database Engine может перемещать данные в куче для более эффективного хранения строк. Поэтому порядок данных нельзя прогнозировать. Чтобы гарантировать порядок строк, возвращаемых из кучи, необходимо использовать предложение ORDER BY. Чтобы указать постоянный логический порядок хранения строк, создайте кластеризованный индекс для таблицы, чтобы таблица не была кучей.


https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes?view=sql-server-ver15
18. laperuz 46 19.07.19 09:33 Сейчас в теме
ВЫБРАТЬ Максимум(ВТ_Исх.Значение) КАК Значение ПОМЕСТИТЬ ВТ_Макс1 ИЗ ВТ_Исх;

ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_БезМакс1 ИЗ ВТ_ИСХ Левое Соединение ВТ_Макс1 ПО ВТ_ИСХ.Значение = ВТ_Макс1.Значение ГДЕ ВТ_Макс1.Значение ЕСТЬ NULL;

ВЫБРАТЬ Максимум(ВТ_БезМакс1 .Значение) КАК Значение ПОМЕСТИТЬ ВТ_Макс2 ИЗ ВТ_БезМакс1 ;

ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_БезМакс2 ИЗ ВТ_БезМакс1 Левое Соединение ВТ_Макс2 ПО ВТ_БезМакс1 .Значение = ВТ_Макс2 .Значение ГДЕ ВТ_Макс2 .Значение ЕСТЬ NULL;
...
...
...
ВЫБРАТЬ * ИЗ ВТ_Исх ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Макс1  ПО ВТ_ИСХ.Значение = ВТ_Макс1.Значение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ * ИЗ ВТ_Исх ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Макс2  ПО ВТ_ИСХ.Значение = ВТ_Макс2.Значение
...
...
...
Показать
19. Melcor16rus 19.07.19 09:34 Сейчас в теме
(18) а если 6 строк получится ил 8 или 100 ? Повторяющиеся значения идут как одна позиция
20. laperuz 46 19.07.19 09:36 Сейчас в теме
(19) Не понял что значит 6, 8 или 100?
Мы выбрали 5 максимальных значений, потом соединили с основной таблицей, получили хоть тысячу строк, но значения у всех будут 5-ю максимальными.
Fox-trot; +1 Ответить
21. Melcor16rus 19.07.19 09:38 Сейчас в теме
(20) Ааа, сорян, думал предлагаешь столько ВТ делать сколько надо значений)
Интересный вариант, опробую.
22. laperuz 46 19.07.19 09:41 Сейчас в теме
(21) Ага. Чуть-чуть подредактировал запрос, изначально не совсем корректно было.
25. chemezov 47 19.07.19 09:54 Сейчас в теме
Итоговый запрос. Где после пятого максимума по найденным числам ищзем сроки. Елси это надо
ВЫБРАТЬ
	ВЫРАЗИТЬ(Товары.Товар КАК Строка(20)) КАК Товар,
	Товары.Количество КАК Количество
ПОМЕСТИТЬ ВТ_ИсходнаяТаблица
ИЗ
	&Товары КАК Товары
;

ВЫБРАТЬ
	МАКСИМУМ(ВТ_ИсходнаяТаблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ПервыйМаксимум
Из
	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
;

ВЫБРАТЬ
	МАКСИМУМ(ВТ_ИсходнаяТаблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ВторойМаксимум
ИЗ
	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
ГДЕ
	НЕ ВТ_ИсходнаяТаблица.Количество В (Выбрать ВТ_ПервыйМаксимум.Количество из ВТ_ПервыйМаксимум КАК ВТ_ПервыйМаксимум)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
	ВТ_ПервыйМаксимум.Количество КАК Количество
Из
	ВТ_ПервыйМаксимум КАК ВТ_ПервыйМаксимум

;

ВЫБРАТЬ
	МАКСИМУМ(ВТ_ИсходнаяТаблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ТретийМаксимум
ИЗ
	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
ГДЕ
	НЕ ВТ_ИсходнаяТаблица.Количество В (Выбрать ВТ_ВторойМаксимум.Количество из ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
	ВТ_ВторойМаксимум.Количество КАК Количество
Из
	ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум
	
;

ВЫБРАТЬ
	МАКСИМУМ(ВТ_ИсходнаяТаблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ЧетвертыйМаксимум
ИЗ
	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
ГДЕ
	НЕ ВТ_ИсходнаяТаблица.Количество В (Выбрать ВТ_ТретийМаксимум.Количество из ВТ_ТретийМаксимум КАК ВТ_ТретийМаксимум)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
	ВТ_ТретийМаксимум.Количество КАК Количество
Из
	ВТ_ТретийМаксимум КАК ВТ_ТретийМаксимум	
	
	
;

ВЫБРАТЬ
	МАКСИМУМ(ВТ_ИсходнаяТаблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ПятыйМаксимум
ИЗ
	ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
ГДЕ
	НЕ ВТ_ИсходнаяТаблица.Количество В (Выбрать ВТ_ЧетвертыйМаксимум.Количество из ВТ_ЧетвертыйМаксимум КАК ВТ_ЧетвертыйМаксимум)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
	ВТ_ЧетвертыйМаксимум.Количество КАК Количество
Из
	ВТ_ЧетвертыйМаксимум КАК ВТ_ЧетвертыйМаксимум	
			
;

ВЫБРАТЬ
	ВТ_ПятыйМаксимум.Количество Количество,
	ВТ_ИсходнаяТаблица.Товар КАК Товар
Из
	ВТ_ПятыйМаксимум КАК ВТ_ПятыйМаксимум
	ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица
	ПО ВТ_ИсходнаяТаблица.Количество = ВТ_ПятыйМаксимум.Количество
	
Показать
Прикрепленные файлы:
24. chemezov 47 19.07.19 09:48 Сейчас в теме
выбрать
	Товары.Товар КАК Товар,
	Товары.Количество КАК Количество
ПОМЕСТИТЬ ВТ_ТАБ
Из
	&Товары КАК Товары
;

Выбрать
	МАКСИМУМ(ВТ_Таблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ПервыйМаксимум
Из
	ВТ_ТАБ КАК ВТ_Таблица
;
Выбрать
	МАКСИМУМ(ВТ_Таблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ВторойМаксимум
Из
	ВТ_ТАБ КАК ВТ_Таблица
ГДЕ
	НЕ ВТ_Таблица.Количество В (Выбрать ВТ_ПервыйМаксимум.Количество из ВТ_ПервыйМаксимум КАК ВТ_ПервыйМаксимум)
ОБЪЕДИНИТЬ
Выбрать
	ВТ_ПервыйМаксимум.Количество КАК Количество
Из
	ВТ_ПервыйМаксимум КАК ВТ_ПервыйМаксимум

;

Выбрать
	МАКСИМУМ(ВТ_Таблица.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_ТретийМаксимум
Из
	ВТ_ТАБ КАК ВТ_Таблица
ГДЕ
	НЕ ВТ_Таблица.Количество В (Выбрать ВТ_ВторойМаксимум.Количество из ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум)
ОБЪЕДИНИТЬ
Выбрать
	ВТ_ВторойМаксимум.Количество КАК Количество
Из
	ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум
Показать




И Так далее до ВТ_ПятыйМаксимум
27. YannikAlx 43 19.07.19 09:57 Сейчас в теме
(24) Что-то уж очень вы перемудрили....
29. chemezov 47 19.07.19 10:01 Сейчас в теме
(27)
Потому что я сначала уточнил всю соль задачи)). Плюс вы забыли что УПОРЯДОЧИТЬ в временной таблице не работает).
31. YannikAlx 43 19.07.19 10:08 Сейчас в теме
(29) ""УПОРЯДОЧИТЬ в временной таблице не работает).""
Кто вам сказал такую глупость?
Выполните мой запрос и убедитесь что ВСЕ работает!
32. chemezov 47 19.07.19 10:12 Сейчас в теме
(31)
ВСЕ работает

Только если вы используете ПЕРВЫЕ. Но ПЕРВЫЕ по условию задачи не подходит для решения.
Прикрепленные файлы:
33. YannikAlx 43 19.07.19 10:15 Сейчас в теме
(32) Значит вы не умеете использовать ВСЕ возможности 1С запросов!
Где написано в условии , что нельзя применить
ВЫБРАТЬ ПЕРВЫЕ 1000000000000000000000000000 ???
Вот то же...
34. YannikAlx 43 19.07.19 10:17 Сейчас в теме
(32) И вообще выполните запрос из (30) и убедитесь...
35. chemezov 47 19.07.19 10:23 Сейчас в теме
(34)
и убедитесь


Хахахаха. Суть в том что вы хоть триллиард первых используйте, прикол у задачи в том что строки с количеством 10 должно получиться две). Потому что одинаковые "максималки" надо накапливать. Это отсекает ИМХО смысл использования ПЕРВЫЕ, хотя может его можно еще как то для этой задачи применить, но с группировкой он не даст результат, который нужен по условию. Однако, посмотрим. ТС в итоге рассудит).

Цитата:

Нужно получить первые 5 максимальных значений, но если какие-то значения повторяются, то значит уже не 5, а 6, как в примере выше
37. YannikAlx 43 19.07.19 10:32 Сейчас в теме
(35) Вы банально еще и читать не умеете!
Я же сказал ВЫПОЛНИТЕ запрос из (30) не с потолка а из (30)!!!
там и картинки есть для тех кто не умеет консолью пользоваться...
Но повторю картинку с 6 строками в Результате


Может хватит гордыню тешить?
Прикрепленные файлы:
38. chemezov 47 19.07.19 10:42 Сейчас в теме
(37) Да, круто. Локанично и правильный результат. Соединения я бы иначе сделал, чтобы на нулл не проверять лишний раз. Но тоже круто).
39. YannikAlx 43 19.07.19 10:44 Сейчас в теме
(38) Поделитесь своим вариантом соединения .
Я так с удовольствием увижу исправления слабых мест своего варианта
40. laperuz 46 19.07.19 10:47 Сейчас в теме
(39)
Левое заменить на внутреннее и можно убрать проверку на не NULL
43. YannikAlx 43 19.07.19 10:51 Сейчас в теме
(40) Да спасибо...
Я просто очень люблю именно левые соединения. С ними все ясно и подконтрольно и можно увидеть при разработке что будем отбрасывать, а внутреннее недолюбливаю.
Но безусловно ВНУТРЕННЕЕ - верно
41. chemezov 47 19.07.19 10:50 Сейчас в теме
(39) Да не это так ерунда. Если тут соединить наоборот, то на Нулл проверка будет не нужна.
ВЫБРАТЬ ПЕРВЫЕ 10000000000
    ВТ_Исходная.ТОВ КАК ТОВ,
    ВТ_УПОРЯДОЧЕННАЯ.Значение КАК Значение
ПОМЕСТИТЬ ВТ_РЕЗУЛЬТАТ
ИЗ
    ВТ_УПОРЯДОЧЕННАЯ КАК ВТ_УПОРЯДОЧЕННАЯ 
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Исходная КАК ВТ_Исходная 
        ПО (ВТ_УПОРЯДОЧЕННАЯ.Значение = ВТ_Исходная.Значение)
УПОРЯДОЧИТЬ ПО
    ВТ_Исходная.ТОВ
Показать
46. YannikAlx 43 19.07.19 10:59 Сейчас в теме
(41) А вот это уже красиво!
До этого не додумался!!!
Спасибо!
26. YannikAlx 43 19.07.19 09:54 Сейчас в теме
Короче меньше базара больше правильного кода!

ВЫБРАТЬ 
"Тов1" КАК ТОВ,
3 КАК Значение 
ПОМЕСТИТЬ ВТ_Исходная

ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов2" КАК ТОВ,
7 КАК Значение 

ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов3" КАК ТОВ,
10 КАК Значение 


ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов4" КАК ТОВ,
5 КАК Значение 


ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов5" КАК ТОВ,
6 КАК Значение 


ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов6" КАК ТОВ,
10 КАК Значение 

ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ первые 1000
"Тов7" КАК ТОВ,
1 КАК Значение 
;
Выбрать ПЕРВЫЕ 5
МАКСИМУМ(ТОВ) КАК ТОВ,
Значение
ПОМЕСТИТЬ ВТ_УПОРЯДОЧЕННАЯ
Из ВТ_Исходная
СГРУППИРОВАТЬ ПО Значение
УПОРЯДОЧИТЬ ПО Значение УБЫВ
Показать
Прикрепленные файлы:
28. laperuz 46 19.07.19 09:58 Сейчас в теме
(26) Тов3 тоже должен был вывестись)
30. YannikAlx 43 19.07.19 10:07 Сейчас в теме
(28) Значит дописываем еще немного
ВЫБРАТЬ
	"Тов1" КАК ТОВ,
	3 КАК Значение
ПОМЕСТИТЬ ВТ_Исходная

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

ВЫБРАТЬ 
	"Тов2",
	7

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

ВЫБРАТЬ 
	"Тов3",
	10

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

ВЫБРАТЬ 
	"Тов4",
	5

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

ВЫБРАТЬ 
	"Тов5",
	6

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

ВЫБРАТЬ 
	"Тов6",
	10

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

ВЫБРАТЬ 
	"Тов7",
	1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 5
	МАКСИМУМ(ВТ_Исходная.ТОВ) КАК ТОВ,
	ВТ_Исходная.Значение КАК Значение
ПОМЕСТИТЬ ВТ_УПОРЯДОЧЕННАЯ
ИЗ
	ВТ_Исходная КАК ВТ_Исходная

СГРУППИРОВАТЬ ПО
	ВТ_Исходная.Значение

УПОРЯДОЧИТЬ ПО
	ВТ_Исходная.Значение УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 10000000000
	ВТ_Исходная.ТОВ КАК ТОВ,
	ВТ_Исходная.Значение КАК Значение

ПОМЕСТИТЬ ВТ_РЕЗУЛЬТАТ
ИЗ
	ВТ_Исходная КАК ВТ_Исходная
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УПОРЯДОЧЕННАЯ КАК ВТ_УПОРЯДОЧЕННАЯ
		ПО (ВТ_УПОРЯДОЧЕННАЯ.Значение = ВТ_Исходная.Значение)
ГДЕ ВТ_УПОРЯДОЧЕННАЯ.Значение IS NOT NULL
УПОРЯДОЧИТЬ ПО
	ВТ_Исходная.ТОВ
Показать
Прикрепленные файлы:
42. Onwardv 64 19.07.19 10:51 Сейчас в теме
Ну вы, блин, даёте.
Вот решение:
ВЫБРАТЬ	"Тов1" КАК Товар,	3 КАК Количество
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов2",	7
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов3",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов4",	5
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов5",	6
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов6",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов7",	1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5
	ВТ_Данные.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Максимальные
ИЗ
	ВТ_Данные КАК ВТ_Данные

УПОРЯДОЧИТЬ ПО
	Количество УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Данные.Товар,
	ВТ_Данные.Количество
ИЗ
	ВТ_Данные КАК ВТ_Данные
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Максимальные КАК ВТ_Максимальные
		ПО ВТ_Данные.Количество = ВТ_Максимальные.Количество
Показать
44. YannikAlx 43 19.07.19 10:53 Сейчас в теме
(42) Вы проснулись ?
Доброе утро!
Уже все придумано до вас - читайте логи!
45. Onwardv 64 19.07.19 10:59 Сейчас в теме
(44) Действительно.
Одно замечание
В Вашем примере
"МАКСИМУМ(ВТ_Исходная.ТОВ) КАК ТОВ," - совершенно лишнее
Это где Вы создаёте временную таблицу "ВТ_УПОРЯДОЧЕННАЯ"

Также "ПЕРВЫЕ 10000000000" не нужно в последнем пакете, где создается временная таблица "ВТ_РЕЗУЛЬТАТ"
48. YannikAlx 43 19.07.19 11:09 Сейчас в теме
(45) Ваш вариант тоже хорош!
Он еще проще моего ...
Я исходил, чтобы в Упорядоченной таблице хоть как-то сохранить значения Тов (на всякий случай).
Но если оно не нужно, то конечно можно еще упростить по вашему
47. Onwardv 64 19.07.19 11:08 Сейчас в теме
(42) Упс. подтер "Поместить ВТ_Данные" в первом пакете. Должно быть:
ВЫБРАТЬ	"Тов1" КАК Товар,	3 КАК Количество
ПОМЕСТИТЬ  ВТ_Данные
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов2",	7
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов3",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов4",	5
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов5",	6
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов6",	10
ОБЪЕДИНИТЬ ВЫБРАТЬ	"Тов7",	1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5
	ВТ_Данные.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Максимальные
ИЗ
	ВТ_Данные КАК ВТ_Данные

УПОРЯДОЧИТЬ ПО
	Количество УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Данные.Товар,
	ВТ_Данные.Количество
ИЗ
	ВТ_Данные КАК ВТ_Данные
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Максимальные КАК ВТ_Максимальные
		ПО ВТ_Данные.Количество = ВТ_Максимальные.Количество
Показать
49. YannikAlx 43 19.07.19 11:15 Сейчас в теме
(47) Безусловно хорошо.
Единственное добавление, результат требуется во временной Таблице.
50. Melcor16rus 20.07.19 09:04 Сейчас в теме
(47) Элегантное решение, но у меня изменились условия и оно теперь не актуалочка) может подскажите к такому варианту что можно сделать?

Есть запрос по регистру продаж со след полями: РодительНом, Сезон, ХарактеристикаНоменклатуры, Количество
Получаем подобную таблицу:
Ном1 - Сезон1 - Харка1 - 10 шт.
Ном1 - Сезон1 - Харка2 - 5 шт.
Ном1 - Сезон1 - Харка3 - 5 шт.
Ном1 - Сезон1 - Харка4 - 1 шт.
Ном1 - Сезон2 - Харка5 - 8 шт.
Ном1 - Сезон2 - Харка6 - 3 шт.
Ном1 - Сезон2 - Харка7 - 5 шт.
Ном1 - Сезон2 - Харка8 - 4 шт.
Ном2 - Сезон1 - Харка9 - 7 шт.
Ном2 - Сезон1 - Харка10 - 7 шт.
Ном2 - Сезон1 - Харка11 - 5 шт.
Ном2 - Сезон1 - Харка12 - 4 шт.

Нужно получить по первым двум группировкам 2 максимального значения количества, но если кол-ва одинаковые то считаем их как за одно т.е.
на выходе получаем:
Ном1 - Сезон1 - Харка1 - 10 шт.
Ном1 - Сезон1 - Харка2 - 5 шт.
Ном1 - Сезон1 - Харка3 - 5 шт.

Ном1 - Сезон2 - Харка5 - 8 шт.
Ном1 - Сезон2 - Харка7 - 5 шт.

Ном2 - Сезон1 - Харка9 - 7 шт.
Ном2 - Сезон1 - Харка10 - 7 шт.
Ном2 - Сезон1 - Харка11 - 5 шт.
51. Onwardv 64 22.07.19 12:02 Сейчас в теме
(50)
Харка3


Тогда вам нужно получить максимум два раза.
1) просто максимум с группировкой.
2) максимум с группировкой, но меньше первого. (см. после "объединить" в третьем пакете.
Условие соединения : "И ВТ_Данные.Количество < ВТ_Максимум.Количество" как раз для получения предмаксимального значения)

Затем исходные данные соеднинить по группировочным полям и количеству (максимальное и предмаксимальное).
Всё вместе будет выглядеть примерно так:
выбрать "Ном1" как РодительНом, "Сезон1" как Сезон, "Харка1" как ХарактеристикаНоменклатуры, 10 как Количество 
поместить ВТ_Данные                                 
объединить выбрать "Ном1" , "Сезон1" , "Харка2" , 5
объединить выбрать "Ном1" , "Сезон1" , "Харка3" , 5
объединить выбрать "Ном1" , "Сезон1" , "Харка4" , 1
объединить выбрать "Ном1" , "Сезон2" , "Харка5" , 8
объединить выбрать "Ном1" , "Сезон2" , "Харка6" , 3
объединить выбрать "Ном1" , "Сезон2" , "Харка7" , 5
объединить выбрать "Ном1" , "Сезон2" , "Харка8" , 4
объединить выбрать "Ном2" , "Сезон1" , "Харка9" , 7
объединить выбрать "Ном2" , "Сезон1" , "Харка10" , 7
объединить выбрать "Ном2" , "Сезон1" , "Харка11" , 5
объединить выбрать "Ном2" , "Сезон1" , "Харка12" , 4
;
ВЫБРАТЬ
	ВТ_Данные.РодительНом,
	ВТ_Данные.Сезон,
	МАКСИМУМ(ВТ_Данные.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Максимум
ИЗ
	ВТ_Данные КАК ВТ_Данные

СГРУППИРОВАТЬ ПО
	ВТ_Данные.РодительНом,
	ВТ_Данные.Сезон
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Максимум.РодительНом,
	ВТ_Максимум.Сезон,
	ВТ_Максимум.Количество
ПОМЕСТИТЬ ВТ_НужныеКоличества
ИЗ
	ВТ_Максимум КАК ВТ_Максимум

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

ВЫБРАТЬ
	ВТ_Данные.РодительНом,
	ВТ_Данные.Сезон,
	МАКСИМУМ(ВТ_Данные.Количество)
ИЗ
	ВТ_Данные КАК ВТ_Данные
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Максимум КАК ВТ_Максимум
		ПО ВТ_Данные.РодительНом = ВТ_Максимум.РодительНом
			И ВТ_Данные.Сезон = ВТ_Максимум.Сезон
			И ВТ_Данные.Количество < ВТ_Максимум.Количество

СГРУППИРОВАТЬ ПО
	ВТ_Данные.РодительНом,
	ВТ_Данные.Сезон
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Данные.РодительНом,
	ВТ_Данные.Сезон,
	ВТ_Данные.ХарактеристикаНоменклатуры,
	ВТ_Данные.Количество
ИЗ
	ВТ_Данные КАК ВТ_Данные
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НужныеКоличества КАК ВТ_НужныеКоличества
		ПО ВТ_Данные.РодительНом = ВТ_НужныеКоличества.РодительНом
			И ВТ_Данные.Сезон = ВТ_НужныеКоличества.Сезон
			И ВТ_Данные.Количество = ВТ_НужныеКоличества.Количество
Показать
Оставьте свое сообщение

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