Имя: Пароль:
1C
1С v8
Как в запросе выбрать ПЕРВЫЕ 1 для ЛЕВОЕ СОЕДИНЕНИЕ ?
0 VladVons
 
12.12.20
12:10
Нужно выбрать из документов РеализацияТоваровУслуг поля:
Номенклатура
Цена
ЦенаПриходная (из РегистрСведений.ЦеныНоменклатуры на дату документа)

В запрос попадают избыточные данные из РегистрСведений.ЦеныНоменклатуры.
Как подцепить только ОДНУ последнюю запись для нужной даты из РегистрСведений ?  

ВЫБРАТЬ
  ДокРеализацияТоваровУслуг.Номенклатура,
  ДокРеализацияТоваровУслуг.Цена,
  ЕСТЬNULL(РегЦеныНоменклатуры.Цена, 0) КАК ЦенаПриходная
ИЗ
  Документ.РеализацияТоваровУслуг.Товары КАК ДокРеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ
  РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры
  ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И
     (РегЦеныНоменклатуры.Период <= РеализацияТоваровУслуг.Ссылка.Дата) И
     (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная)
1 Вафель
 
12.12.20
12:12
делай соединение Период=(выбрать первые период из рег где перилд < датадок)
2 acht
 
12.12.20
12:15
(0) google://СрезПоследних+на+каждую+дату
3 Маленький Вопросик
 
12.12.20
12:17
нет, используй Максимум в соединяемой таблице... или делай запрос в цикле )))))))
4 acht
 
12.12.20
12:20
(1) Ты про остальные измерения забыл. В результате получится коррелирующий подзапрос на каждую строчку и надо будет ооочень пристально смотреть на производительность.

Будет что-то страшноетипа левое соединие по (Номенклатура, Период, ТипЦен) в (выбрать Номенклатура, Максимум(Период), ТипЦен из ... где Номенклатура = ДокРеализацияТоваровУслуг.Номенклатура И ДокРеализацияТоваровУслуг.ТипЦен сгруппировать по ... )
5 Вафель
 
12.12.20
12:34
(4) предполагается что остальные измерения соответствуют документу
6 Вафель
 
12.12.20
12:35
никаких группировок не нужно
7 acht
 
12.12.20
13:10
А нуну
8 VladVons
 
12.12.20
17:16
(1) Пока сделал так.
Если есть замечания, то поправте и может кому пригодится.


ВЫБРАТЬ
  ДокРеализацияТоваровУслуг.Номенклатура,
  ДокРеализацияТоваровУслуг.Цена,
  ЕСТЬNULL(РегЦеныНоменклатуры.Цена, 0) КАК ЦенаПриходная
ИЗ
  Документ.РеализацияТоваровУслуг.Товары КАК ДокРеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ
  РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры
  ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И
     (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная) И
     (РегЦеныНоменклатуры.Период В (
    ВЫБРАТЬ ПЕРВЫЕ 1
        Период
     ИЗ
        РегистрСведений.ЦеныНоменклатуры
     ГДЕ
       (Номенклатура = ДокРеализацияТоваровУслуг.Номенклатура) И
       (Период <= ДокРеализацияТоваровУслуг.Ссылка.Дата) И
       (ТипЦен = &МакрЦенаПрихода)
    УПОРЯДОЧИТЬ ПО
       Период УБЫВ
    )
    )
9 RomanYS
 
12.12.20
17:23
(8) Коррелированный подзапрос, да ещё и в условиях соединения, да ещё и с трехэтажными конструкциями ДокРеализацияТоваровУслуг.Ссылка.Дата.
Отважно! Решение типа (2) гораздо безопаснее, и вероятно сильно быстрее на приличных объемах данных.
10 Said_We
 
12.12.20
22:40
(9) ""Коррелированный подзапрос" - Отважно!" - в чем отважность? Работают они быстро. Если правильно написать.
Тут вместо "упорядочить по Период убыв" лучше использовать "Выбрать первые 1 Максимум(Период)" - тогда если такой запрос в СКД будет, то "тупить" не будет.
11 RomanYS
 
12.12.20
22:48
(10) Конкретно вот это будет работать быстро!? "Быстро"  - значит я не смогу написать запрос который будет в 2 раза быстрее на тестовом объеме данных.
На самом деле почти уверен, что при определенном объеме данных, запрос будет на порядки(в 10-100-1000 раз) медленнее.
12 RomanYS
 
12.12.20
22:49
(10) СКД опускаем, говорим про "тупой" запрос. В СКД по идее эту задачу вообще по-другому можно решить
13 Said_We
 
12.12.20
22:59
(11) А кто мешает 1С поддерживать конструкцию "Select t.A as A, (select top 1 t1.a from t1 as t1 where .... order by ...) as AA from ... ?
Ещё и читабельно выглядит.
14 RomanYS
 
12.12.20
23:05
(13) Без понятия. Это вопрос к 1С.
На практике (8) и тем более с правкой (10) будет работать неприемлимо медленно при чуть заметном объеме данных.
15 Said_We
 
16.12.20
12:22
(8) В подзапрос с предварительным условием этот кусок запроса:
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры
  ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И
     (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная)"

Номенклатуры в документе не бесчисленное количество, а весьма ограниченное. И цены нам необходимо брать только по ним. И Тип цен нам необходим только один.
Поэтому проще в подзапрос засунуть выборку из РС с наложенными фильтрами. Из соединения условие на тип цен полностью переедет в подзапрос.
Основная теорема систематики: Новые системы плодят новые проблемы.