![]() |
|
Выборка нескольких последних записей по номенклатуре | ☑ | ||
---|---|---|---|---|
0
KnightAlone
05.04.18
✎
11:12
|
Что-то не соображу сходу, как запросом из выборки вида
Дата1 Номенклатура1 Дата2 Номенклатура1 Дата3 Номенклатура1 Дата4 Номенклатура1 Дата5 Номенклатура1 Дата7 Номенклатура2 Дата8 Номенклатура2 Дата9 Номенклатура3 Дата10 Номенклатура3 Дата11 Номенклатура3 Дата12 Номенклатура3 получить по каждой номенклатуре только 3 последних по дате записи. Если бы номенклатура была одна, можно было бы сделать сортировку по убыванию даты и Выбрать Первые 3, но тут то это не прокатит. если кто делал подобную задачу, прошу направить мысль в нужном направлении :) |
|||
1
lodger
05.04.18
✎
11:14
|
обязательно этой порнографией в запросе заниматься?
|
|||
2
lodger
05.04.18
✎
11:16
|
есть дикий план - транспонировать таблицу, чтобы в колонках были номенклатуры, а в строках даты или нуллы по порядку. тогда Выбрать Первые 3 сработает.
минусы - надо формировать текст запроса программно заранее вычислив колво колонок... |
|||
3
ГдеСобака Зарыта
05.04.18
✎
11:19
|
Срез последних на каждую дату надо сделать три раза
|
|||
4
KnightAlone
05.04.18
✎
11:23
|
(1) порно в цикле уже есть. хотелось бы попробовать переделать на запрос. пока думаю в направлении - преобразовывать дату в число по какому-то хитрому правилу в доп поле, потом отсеивать лишнее отбором
|
|||
5
KnightAlone
05.04.18
✎
11:34
|
пока похоже только так - сделать ВТ, в которой группировкой по номенклатуре получить максимальную дату, соединить с текущей таблицей, получив максимальную дату, которая меньше известной максимальной, потом еще раз. получим 3ю дату от максимальной, затем соединяем, отбросив все ниже этой даты
|
|||
6
Ненавижу 1С
гуру
05.04.18
✎
11:36
|
жуткие тормоза
ВЫБРАТЬ ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Период КАК Период ИЗ РегистрНакопления.Продажи.Обороты(&НП, , День, ) КАК ПродажиОбороты ГДЕ ПродажиОбороты.Период В (ВЫБРАТЬ ПЕРВЫЕ 3 Т.Период КАК Период ИЗ РегистрНакопления.Продажи.Обороты(&НП, , День, ) КАК Т ГДЕ Т.Контрагент = ПродажиОбороты.Контрагент УПОРЯДОЧИТЬ ПО Период УБЫВ) УПОРЯДОЧИТЬ ПО Контрагент, Период АВТОУПОРЯДОЧИВАНИЕ |
|||
7
Buster007
05.04.18
✎
11:49
|
где же Гений1С когда он так нужен!?
|
|||
8
KnightAlone
05.04.18
✎
12:25
|
получилось вот такое нечто
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Выборка.Номенклатура, МАКСИМУМ(ВТ_Выборка.Период) КАК Период ПОМЕСТИТЬ ВТ_МаксимальныйМаксимум ИЗ ВТ_Выборка КАК ВТ_Выборка СГРУППИРОВАТЬ ПО ВТ_Выборка.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Выборка.Номенклатура КАК Номенклатура, МАКСИМУМ(ВТ_Выборка.Период) КАК Период ПОМЕСТИТЬ ВТ_ВторойМаксимум ИЗ ВТ_Выборка КАК ВТ_Выборка ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МаксимальныйМаксимум КАК ВТ_МаксимальныйМаксимум ПО ВТ_Выборка.Номенклатура = ВТ_МаксимальныйМаксимум.Номенклатура ГДЕ ВТ_Выборка.Период < ВТ_МаксимальныйМаксимум.Период СГРУППИРОВАТЬ ПО ВТ_Выборка.Номенклатура, ВТ_МаксимальныйМаксимум.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Выборка.Номенклатура, МАКСИМУМ(ВТ_Выборка.Период) КАК Период ПОМЕСТИТЬ ВТ_ТретийМаксимум ИЗ ВТ_Выборка КАК ВТ_Выборка ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум ПО ВТ_Выборка.Номенклатура = ВТ_ВторойМаксимум.Номенклатура ГДЕ ВТ_Выборка.Период < ВТ_ВторойМаксимум.Период СГРУППИРОВАТЬ ПО ВТ_Выборка.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Выборка.Период КАК Период, ВТ_Выборка.Номенклатура КАК Номенклатура, ВТ_Выборка.Количество, ВТ_Выборка.Сумма, ВТ_МаксимальныйМаксимум.Период КАК Месяц1, ВТ_ВторойМаксимум.Период КАК Месяц2, ВТ_ТретийМаксимум.Период КАК Месяц3 ИЗ ВТ_Выборка КАК ВТ_Выборка ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МаксимальныйМаксимум КАК ВТ_МаксимальныйМаксимум ПО ВТ_Выборка.Номенклатура = ВТ_МаксимальныйМаксимум.Номенклатура И ВТ_Выборка.Период = ВТ_МаксимальныйМаксимум.Период ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум ПО ВТ_Выборка.Номенклатура = ВТ_ВторойМаксимум.Номенклатура И ВТ_Выборка.Период = ВТ_ВторойМаксимум.Период ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТретийМаксимум КАК ВТ_ТретийМаксимум ПО ВТ_Выборка.Номенклатура = ВТ_ТретийМаксимум.Номенклатура И ВТ_Выборка.Период = ВТ_ТретийМаксимум.Период получилось что-то вот эдакое, осталось доделать и посмотреть, как оно будет на больших объемах крутится |
|||
9
Buster007
05.04.18
✎
12:48
|
еще посмотри сколько это памяти будет есть )
непонятно, чем тебе не нравится обходить цикл, который, кстати, достаточно легкий в плане производительности, и выбирать столько записей сколько тебе нужно? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |