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