Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как в запросе выбрать ПЕРВЫЕ 1 для ЛЕВОЕ СОЕДИНЕНИЕ ?

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

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

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

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


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

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

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