Имя: Пароль:
1C
1С v8
Найти минимум в связке один-ко-многим
🠗 (Волшебник 10.04.2023 23:04)
0 Alex174
 
10.04.23
14:46
Доброго дня. Что-то не могу допетрить. Есть справочник Контракты. К одному контракту относится много Заказов покупателей. Как мне найти заказ покупателя с минимальной датой для каждого контракта?

Т.е.
Контр1 ЗаказПокупателя1 01.01.2022
Контр1 ЗаказПокупателя2 02.02.2022
Контр1 ЗаказПокупателя3 03.03.2022

Контр2 ЗаказПокупателя4 05.01.2022
Контр2 ЗаказПокупателя5 10.01.2022

Надо найти
Контр1 ЗаказПокупателя1 01.01.2022
Контр2 ЗаказПокупателя4 05.01.2022
1 PR
 
10.04.23
14:48
(0) Сначала делаешь временную таблицу с минимальными датами по покупателям, потом соединяешь основную с ней
2 PR
 
10.04.23
14:48
(1) Не забудь еще добавить этап с получением минимального заказа, а то в одну дату может быть несколько заказов
3 Alex174
 
10.04.23
14:51
(1) Какого формата? ЗаказПокупателя И дата связаны 1-к-1
4 mikecool
 
10.04.23
15:01
(3) да, тяжело...
сгруппируй по контр + минимум(Дата)
потом по дате и контр привяжи заказ
5 PR
 
10.04.23
15:02
(3) ЗаказПокупателя И дата связаны многие-к-1
6 PR
 
10.04.23
15:02
(4) Еще (2)
7 mikecool
 
10.04.23
15:05
(6) это потянет на вторую ветку , не иначе )
8 PR
 
10.04.23
15:14
(7) Да не говори, задрали
Уже была ветка месяц назад или два
9 azernot
 
10.04.23
15:26
ВЫБРАТЬ
    Заказы.Ссылка КАК Заказ,
    Заказы.Дата,
    Заказы.Контрагент
ПОМЕСТИТЬ ВсеЗаказы
ИЗ
    Документ.Заказ КАК Заказы
Где
бла-бла-бла
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(Дата) КАК МинимальнаяДата,
    Контрагент КАК Контрагент
ПОМЕСТИТЬ МинимальныеДаты
ИЗ
    ВсеЗаказы КАК ВсеЗаказы

СГРУППИРОВАТЬ ПО
    Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(ВсеЗаказы.Заказ) КАК Заказ,
    ВсеЗаказы.Контрагент КАК Контрагент
ИЗ
    ВсеЗаказы КАК ВсеЗаказы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ МинимальныеДаты КАК МинимальныеДаты
        ПО ВсеЗаказы.Контрагент = МинимальныеДаты.Контрагент
            И ВсеЗаказы.Дата = МинимальныеДаты.МинимальнаяДата

СГРУППИРОВАТЬ ПО
    ВсеЗаказы.Контрагент
14 PR
 
10.04.23
17:28
(9) Я же говорю, нужно соединение с регистраторами, а не датами
17 azernot
 
10.04.23
17:42
(13) А по мне, так последовательная обработка - нагляднее, я могу посмотреть/отладить промежуточные данные, плюс я могу заюзать индексы. Лично мне кажется, что для начинающих такая форма - полезнее.

>Это вы что-то путаете
Это не я что-то путаю, а вы ошиблись в своём запросе. Он выдаст данные противоречащие постановке. Даже если предположить, что двух заказов от одной даты по одному контракту не бывает.
Ошибка очевидна, исправляется легко, скорее всего виновата ваша спешка, но как говорится, из песни слов не выкинешь.
18 PR
 
10.04.23
17:44
(16) Нет
Возможны дубли
Читай (2)
20 PR
 
10.04.23
17:49
(19) Потому что это ошибочное утверждение, я же написал в (5)
21 mikecool
 
10.04.23
17:49
(13) вложенные запросы для оптимизатора "трудны", что может приводить к деградации скорости получения результата
23 azernot
 
10.04.23
17:51
(22) И Т1.Заказ=Т2.Заказ
это условие делает условие бессмысленным.
26 mikecool
 
10.04.23
17:57
(24) " У заказчика не будет двух заказов по одному контракту в одну дату." - а вот это может быть ложь.
у него может быть несколько заказов в 1 секунду
28 Alex174
 
11.04.23
07:43
(9) Такая штука не срабатывает, если в одну секунду есть два документа. А они есть к сожалению...
29 Alex174
 
11.04.23
08:48
(9) Хотя нет, сработало. Тему можно закрывать. Всем спасибо.