Имя: Пароль:
1C
1С v8
Оптимальность запроса на получене второго документа от Заказчика
0 Fedor-1971
 
26.01.15
11:50
Задача: получить даты двух первых документов от каждого Заказчика

Есть запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
    тэоЗаказНовый.Ссылка КАК Ссылка
ПОМЕСТИТЬ табЗаказов
ИЗ
    Документ.Заказ КАК тэоЗаказНовый
ГДЕ
    НЕ тэоЗаказНовый.ПометкаУдаления
    И тэоЗаказНовый.Заказчик В(&масЗаказчиков)
;
ВЫБРАТЬ
    тэоЗаказНовый.Ссылка,
    КоличествоЗаказов.Заказчик,
    Ур1.Д1
ПОМЕСТИТЬ табУровень1
    
ИЗ
    табЗаказов КАК тэоЗаказНовый
        Левое Соединение (ВЫБРАТЬ
        Минимум(уровень.Ссылка.Дата) КАК Д1,
        уровень.Ссылка.Заказчик КАК Заказчик
     ИЗ
        табЗаказов КАК уровень
    
     СГРУППИРОВАТЬ ПО
         уровень.Ссылка.Заказчик) как Ур1 по тэоЗаказНовый.Ссылка.Заказчик=Ур1.Заказчик
;
ВЫБРАТЬ
        тэоЗаказНовый.Ссылка,
    тэоЗаказНовый.Заказчик,
    тэоЗаказНовый.Сколько,
    тэоЗаказНовый.Д1,
    Минимум(Ур2.Д2)
    
ИЗ
    табУровень1 КАК тэоЗаказНовый
        Левое Соединение (ВЫБРАТЬ
        уровень.Ссылка.Дата КАК Д2,
        уровень.Ссылка.Заказчик КАК Заказчик
    ИЗ
        табЗаказов КАК уровень) как Ур2 по тэоЗаказНовый.Ссылка.Заказчик=Ур2.Заказчик и Ур2.Д2>тэоЗаказНовый.Д1
       СГРУППИРОВАТЬ ПО
    тэоЗаказНовый.Ссылка,
    тэоЗаказНовый.Заказчик,
    тэоЗаказНовый.Сколько,
    тэоЗаказНовый.Д1


Напрягает вот эта часть:
    Левое Соединение (ВЫБРАТЬ
        уровень.Ссылка.Дата КАК Д2,
        уровень.Ссылка.Заказчик КАК Заказчик
    ИЗ
        табЗаказов КАК уровень) как Ур2 по тэоЗаказНовый.Ссылка.Заказчик=Ур2.Заказчик и Ур2.Д2>тэоЗаказНовый.Д1

т.е. выбираем ВСЕ оставшиеся документы, кроме первого и только потом получаем минимальную дату из полученной выборки.
В результате напрягаем сервер, может есть более оптимальный алгоритм?
1 Fedor-1971
 
26.01.15
12:45
странно, но похоже, что это нормальная работа запросов.
2 Креатив
 
26.01.15
13:00
(1) Всё зависит от того, зачем тебе такие данные? Если тебе не обязательно в одной строке получать эти два документа, то можно объединить первые документы со вторыми. Потом отсортировать по заказчику и дате. На заказчика будет не более двух строк идущих подряд.
3 Fedor-1971
 
26.01.15
13:17
(2) что-бы объединить первые+вторые, вторые сначала нужно получить, т.е. опять-же выбрать.
Для ограничения выборки имело бы смысл обработать только 2 первых документа каждого Заказчика, а не выбирать все оставшиеся (кроме первого).