Вход | Регистрация


Выборка нескольких последних записей по номенклатуре

Выборка нескольких последних записей по номенклатуре
Я
   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, но тут то это не прокатит. если кто делал подобную задачу, прошу направить мысль в нужном направлении :)
 
 
   lodger
 
1 - 05.04.18 - 11:14
обязательно этой порнографией в запросе заниматься?
   lodger
 
2 - 05.04.18 - 11:16
есть дикий план - транспонировать таблицу, чтобы в колонках были номенклатуры, а в строках даты или нуллы по порядку. тогда Выбрать Первые 3 сработает.
минусы - надо формировать текст запроса программно заранее вычислив колво колонок...
   ГдеСобакаЗарыта
 
3 - 05.04.18 - 11:19
Срез последних на каждую дату надо сделать три раза
   KnightAlone
 
4 - 05.04.18 - 11:23
(1) порно в цикле уже есть. хотелось бы попробовать переделать на запрос. пока думаю в направлении - преобразовывать дату в число по какому-то хитрому правилу в доп поле, потом отсеивать лишнее отбором
   KnightAlone
 
5 - 05.04.18 - 11:34
пока похоже только так - сделать ВТ, в которой группировкой по номенклатуре получить максимальную дату, соединить с текущей таблицей, получив максимальную дату, которая меньше известной максимальной, потом еще раз. получим 3ю дату от максимальной, затем соединяем, отбросив все ниже этой даты
   Ненавижу 1С
 
6 - 05.04.18 - 11:36
жуткие тормоза

ВЫБРАТЬ
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Период КАК Период
ИЗ
    РегистрНакопления.Продажи.Обороты(&НП, , День, ) КАК ПродажиОбороты
ГДЕ
    ПродажиОбороты.Период В
            (ВЫБРАТЬ ПЕРВЫЕ 3
                Т.Период КАК Период
            ИЗ
                РегистрНакопления.Продажи.Обороты(&НП, , День, ) КАК Т
            ГДЕ
                Т.Контрагент = ПродажиОбороты.Контрагент
            УПОРЯДОЧИТЬ ПО
                Период УБЫВ)

УПОРЯДОЧИТЬ ПО
    Контрагент,
    Период
АВТОУПОРЯДОЧИВАНИЕ
   Buster007
 
7 - 05.04.18 - 11:49
где же Гений1С когда он так нужен!?
   KnightAlone
 
8 - 05.04.18 - 12:25
получилось вот такое нечто

////////////////////////////////////////////////////////////////////////////////

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

СГРУППИРОВАТЬ ПО
    ВТ_Выборка.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////

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

СГРУППИРОВАТЬ ПО
    ВТ_Выборка.Номенклатура,
    ВТ_МаксимальныйМаксимум.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Выборка.Номенклатура,
    МАКСИМУМ(ВТ_Выборка.Период) КАК Период
ПОМЕСТИТЬ ВТ_ТретийМаксимум
ИЗ
    ВТ_Выборка КАК ВТ_Выборка
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум
        ПО ВТ_Выборка.Номенклатура = ВТ_ВторойМаксимум.Номенклатура
ГДЕ
    ВТ_Выборка.Период < ВТ_ВторойМаксимум.Период

СГРУППИРОВАТЬ ПО
    ВТ_Выборка.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Выборка.Период КАК Период,
    ВТ_Выборка.Номенклатура КАК Номенклатура,
    ВТ_Выборка.Количество,
    ВТ_Выборка.Сумма,
    ВТ_МаксимальныйМаксимум.Период КАК Месяц1,
    ВТ_ВторойМаксимум.Период КАК Месяц2,
    ВТ_ТретийМаксимум.Период КАК Месяц3

ИЗ
    ВТ_Выборка КАК ВТ_Выборка
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МаксимальныйМаксимум КАК ВТ_МаксимальныйМаксимум
        ПО ВТ_Выборка.Номенклатура = ВТ_МаксимальныйМаксимум.Номенклатура
            И ВТ_Выборка.Период = ВТ_МаксимальныйМаксимум.Период
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВторойМаксимум КАК ВТ_ВторойМаксимум
        ПО ВТ_Выборка.Номенклатура = ВТ_ВторойМаксимум.Номенклатура
            И ВТ_Выборка.Период = ВТ_ВторойМаксимум.Период
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТретийМаксимум КАК ВТ_ТретийМаксимум
        ПО ВТ_Выборка.Номенклатура = ВТ_ТретийМаксимум.Номенклатура
            И ВТ_Выборка.Период = ВТ_ТретийМаксимум.Период

получилось что-то вот эдакое, осталось доделать и посмотреть, как оно будет на больших объемах крутится
   Buster007
 
9 - 05.04.18 - 12:48
еще посмотри сколько это памяти будет есть )
непонятно, чем тебе не нравится обходить цикл, который,  кстати, достаточно легкий в плане производительности, и выбирать столько записей сколько тебе нужно?

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует