Дубли строк при соединении регистров сведений (СрезПоследних)
Добрый день!
В УТ 11 есть регистр сведений ЦеныНоменклатурыПоставщиков (периодичность: В пределах секунды; режим записи: Подчинение регистратору).
Мне нужно получить последние цены для каждого товара из этого регистра, приведенные к рублям по текущему курсу.
Я делаю левое соединение виртуальной таблицы ЦеныНоменклатурыПоставщиковСрезПоследних и КурсыВалютСрезПоследних по полю Валюта. Передаю дату как параметр в поле Период этих виртуальных таблиц.
В результатах запроса получаются дубли строк из-за того, что Соглашение и УсловиеЦеныПоставщика я не вывожу (нет такой надобности), но они у этих строк отличаются.
Применить группировку не представляется возможным потому, что ресурсы Цена и Валюта у строк с одинаковыми Номенклатурой и Характеристикой могут отличаться.
Как мне получить одну единственную строку для каждой номенклатурной позиции, соответствующую самому последнему регистратору по дате?
В УТ 11 есть регистр сведений ЦеныНоменклатурыПоставщиков (периодичность: В пределах секунды; режим записи: Подчинение регистратору).
Мне нужно получить последние цены для каждого товара из этого регистра, приведенные к рублям по текущему курсу.
Я делаю левое соединение виртуальной таблицы ЦеныНоменклатурыПоставщиковСрезПоследних и КурсыВалютСрезПоследних по полю Валюта. Передаю дату как параметр в поле Период этих виртуальных таблиц.
В результатах запроса получаются дубли строк из-за того, что Соглашение и УсловиеЦеныПоставщика я не вывожу (нет такой надобности), но они у этих строк отличаются.
Применить группировку не представляется возможным потому, что ресурсы Цена и Валюта у строк с одинаковыми Номенклатурой и Характеристикой могут отличаться.
Как мне получить одну единственную строку для каждой номенклатурной позиции, соответствующую самому последнему регистратору по дате?
Прикрепленные файлы:


По теме из базы знаний
Найденные решения
(36) Alexey26,
(37) anterehin,
удалось снизить до 1%. Принимаются предложения по оптимизации его производительности)
снизить не удастся скорее всего именно потмоу что попадаются моменты как я эмулировал в (33), с производительностью у Вас все нормально.
(37) anterehin,
Выбрать первые 1
получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Alexey26,
"Глупо поставленная задача влечет еще более глупое решение" (с)
(4) andrewks, (11) Lyns_owner, (10) Sverhnovaya,
"Если программист видит, что задача - глупа, он должен указать на это заказчику" (с)
В результатах запроса получаются дубли строк из-за того, что Соглашение и УсловиеЦеныПоставщика я не вывожу
"Глупо поставленная задача влечет еще более глупое решение" (с)
(4) andrewks, (11) Lyns_owner, (10) Sverhnovaya,
"Если программист видит, что задача - глупа, он должен указать на это заказчику" (с)
(12) AlexO, не могу судить о том, насколько умно сформулирована данная конкретная задача, но мне кажется, что в общем случае задача получения неповторяющихся записей из среза последних по регистру сведений, не все измерения которого нас интересуют (или нам известны), является не такой уж и экзотической.
(3) Alexey26, примерно так
select
Даты.Дата as Дата
,ТабКурсов.Валюта as Валюта
,max(ТабКурсов.Период) as Период
from
Даты
left join
РегистрСведений.КурсыВалют as ТабКурсов
on
(ТабКурсов.Валюта=&ВыбВалюта) and (ТабКурсов.Период<=Даты.Дата)
group by
Даты.Дата
,ТабКурсов.Валюта
Показать
Задача простая) зачем тему создавать :)
ВЫБРАТЬ
ДатыКурсов.Номенклатура,
ДатыКурсов.ХарактеристикаНоменклатуры,
ДатыКурсов.Валюта,
ДатыКурсов.МаксимальнаяДата,
ДатыКурсов.Цена,
ДатыКурсов.Артикул,
КурсыВалют.Курс,
КурсыВалют.Кратность
ИЗ
(ВЫБРАТЬ
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта КАК Валюта,
МАКСИМУМ(КурсыВалют.Период) КАК МаксимальнаяДата,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК Цена,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура.Артикул КАК Артикул
ИЗ
РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Период >= КурсыВалют.Период
И ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта = КурсыВалют.Валюта
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена,
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура.Артикул) КАК ДатыКурсов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ДатыКурсов.Валюта = КурсыВалют.Валюта
И ДатыКурсов.МаксимальнаяДата = КурсыВалют.Период
Показать
(11) Lyns_owner, после нескольких циклов переименований добился от Вашего запроса выполнения без синтаксических ошибок. Сейчас начну искать в нем наличие логических:
ВЫБРАТЬ
ДатыКурсов.Номенклатура,
ДатыКурсов.Характеристика,
ДатыКурсов.Валюта,
ДатыКурсов.МаксимальнаяДата,
ДатыКурсов.Цена,
ДатыКурсов.Артикул,
КурсыВалют.Курс,
КурсыВалют.Кратность
ИЗ
(ВЫБРАТЬ
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыПоставщиковСрезПоследних.Характеристика КАК Характеристика,
ЦеныНоменклатурыПоставщиковСрезПоследних.Валюта КАК Валюта,
МАКСИМУМ(КурсыВалют.Период) КАК МаксимальнаяДата,
ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена,
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура.Артикул КАК Артикул
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыПоставщиковСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ЦеныНоменклатурыПоставщиковСрезПоследних.Период >= КурсыВалют.Период
И ЦеныНоменклатурыПоставщиковСрезПоследних.Валюта = КурсыВалют.Валюта
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура,
ЦеныНоменклатурыПоставщиковСрезПоследних.Характеристика,
ЦеныНоменклатурыПоставщиковСрезПоследних.Валюта,
ЦеныНоменклатурыПоставщиковСрезПоследних.Цена,
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура.Артикул) КАК ДатыКурсов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ДатыКурсов.Валюта = КурсыВалют.Валюта
И ДатыКурсов.МаксимальнаяДата = КурсыВалют.Период
Показать
(13) Alexey26, "после нескольких циклов переименований добился от Вашего запроса выполнения без синтаксических ошибок. Сейчас начну искать в нем наличие логических:"
Коллега в (4) дал вам готовый запрос, его только чуток под себя подстроить, а вы носом крутите :(
Коллега в (4) дал вам готовый запрос, его только чуток под себя подстроить, а вы носом крутите :(
(17) Alexey26, Вы их никогда не подстроите, потому что Вам надо определиться по какому соглашению брать Цену, если их в регистре несколько? а я в выложенных запросах что то не вижу решения этой проблемы... а еще в УТ есть регистр сведений ЦеныНоменклатуры, если Вам не нужен разрез Контрагентов, то может правильнее использовать его?
(13) Alexey26, Я признателен человеку только за то, что он показал мне, в какую сторону копать) Вы же хотите получить готовое решение, ничего при этом не сделав. Обладая элементарными знаниями языка запросов, надо лишь немного подумать, чтобы написать данный запрос. Я надеюсь вы не считаете, что вам отвечают из-за объявленного вами вознаграждения?)
(26) Alexey26,
Вы сами ответили на свой вопрос. Они увидят ответ на АНАЛОГИЧНУЮ проблему, а потом применяют его к своей, чего и вам советую.
Потому, что я не одобряю лень. Включите уже мозг и подумайте немного сами. Форум существует для помощи, а не для реализации ваших задач чужими силами.
аналогичной проблемы
Вы сами ответили на свой вопрос. Они увидят ответ на АНАЛОГИЧНУЮ проблему, а потом применяют его к своей, чего и вам советую.
Я не понимаю, если человек может и начинает помогать другому, то почему не сделать этого до конца?
Потому, что я не одобряю лень. Включите уже мозг и подумайте немного сами. Форум существует для помощи, а не для реализации ваших задач чужими силами.
Как вариант перекинуть весь этот запрос во вложенный, только добавить поле регистратор, сделать еще один вложенный запрос где выбрать срез последних записей по регистру ЦеныНоменклатурыПоставщиков без поля валюта(т.е только нужные поля по измерениям), и добавить поле регистратор. Затем соединить эти два вложенных запроса, по полю регистратор номенклатура характеристика , выбрав только те что встречаются во втором запросе. Изврат конечно, но сработать должно.
(18) Sverhnovaya,
да, есть такая проблема - если вводить одним документом, то возникнут задвоения, от которых уже не избавиться прежним способом. Но предполагается, что таких случаев будет относительно мало, так что на них можно закрыть глаза)
подскажите пожалуйста. возможно ли одним документом внести цены по двум и более УсловиямЦеныПоставщика?, если да, то уточните политику партии по выбору из них одной
да, есть такая проблема - если вводить одним документом, то возникнут задвоения, от которых уже не избавиться прежним способом. Но предполагается, что таких случаев будет относительно мало, так что на них можно закрыть глаза)
ВЫБРАТЬ
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры,
МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс * КурсыВалютСрезПоследних.Кратность) КАК МаксимальнаяЦенаВРублях
ИЗ
РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, ) КАК КурсыВалютСрезПоследних
ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры
УПОРЯДОЧИТЬ ПО
Номенклатура
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры,
МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс * КурсыВалютСрезПоследних.Кратность) КАК МаксимальнаяЦенаВРублях
ИЗ
РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, ) КАК КурсыВалютСрезПоследних
ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры
УПОРЯДОЧИТЬ ПО
Номенклатура
(20) Sverhnovaya,
не получится у (0) то что он хотит пока не определится - какую цену из рег. брать, если есть записи по двум или более соглашениям, задвоение идет не от валюты, а именно от соглашений
Применить группировку не представляется возможным потому, что ресурсы Цена и Валюта у строк с одинаковыми Номенклатурой и Характеристикой могут отличаться.
не получится у (0) то что он хотит пока не определится - какую цену из рег. брать, если есть записи по двум или более соглашениям, задвоение идет не от валюты, а именно от соглашений
Прикрепленные файлы:


Двоение не из-за соглашения, а из-за того что в один момент времени есть записи для нескольких соглашение, таким образом есть 2 решения: 1 одним документом вносить данные по одному соглашению 2е привести к одной валюте, те получить цену в базовой валюте и выбрать одну исходя из решения заказчика(максимальную минимальную среднюю).
(23) Sverhnovaya,
Именно из-за Соглашений - которые определяют валюту, цену....
Это ОСНОВНОЕ измерение данного документа, и его в принципе нельзя не учитывать.
О чем и сообщает запрос к регистру ЦеныНоменклатурыПоставщика.
Двоение не из-за соглашения, а из-за того что в один момент времени есть записи для нескольких соглашение
Именно из-за Соглашений - которые определяют валюту, цену....
Это ОСНОВНОЕ измерение данного документа, и его в принципе нельзя не учитывать.
О чем и сообщает запрос к регистру ЦеныНоменклатурыПоставщика.
Публикую свой запрос. Процент дублей строк на моих тестовых данных (это около 100 тыс. номенклатурных позиций) удалось снизить до 1%. Принимаются предложения по оптимизации его производительности)
ВЫБРАТЬ
МАКСИМУМ(ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Период) КАК Период,
ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Характеристика КАК Характеристика
ПОМЕСТИТЬ МаксимальныеПериодыВТ
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыПоставщиковМаксимальныеПериоды
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Характеристика,
ЦеныНоменклатурыПоставщиковМаксимальныеПериоды.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Характеристика
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыПоставщиковСрезПоследних.Характеристика КАК Характеристика,
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура.Артикул КАК Артикул,
ЦеныНоменклатурыПоставщиковСрезПоследних.Цена,
ЦеныНоменклатурыПоставщиковСрезПоследних.Валюта,
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура.Производитель КАК Производитель,
ЦеныНоменклатурыПоставщиковСрезПоследних.Регистратор
ПОМЕСТИТЬ ЦеныНоменклатурыПоставщиковВТ
ИЗ
МаксимальныеПериодыВТ КАК МаксимальныеПериодыВТ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыПоставщиковСрезПоследних
ПО МаксимальныеПериодыВТ.Номенклатура = ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура
И МаксимальныеПериодыВТ.Характеристика = ЦеныНоменклатурыПоставщиковСрезПоследних.Характеристика
И МаксимальныеПериодыВТ.Период <= ЦеныНоменклатурыПоставщиковСрезПоследних.Период
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Характеристика
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатурыПоставщиковВТ.Номенклатура КАК Наименование,
ЦеныНоменклатурыПоставщиковВТ.Номенклатура.Артикул КАК Артикул,
ЦеныНоменклатурыПоставщиковВТ.Цена * ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1) КАК ЦенаВРуб,
ЦеныНоменклатурыПоставщиковВТ.Номенклатура.Производитель КАК Производитель,
ЦеныНоменклатурыПоставщиковВТ.Характеристика,
ЦеныНоменклатурыПоставщиковВТ.Цена,
ЦеныНоменклатурыПоставщиковВТ.Валюта
ИЗ
ЦеныНоменклатурыПоставщиковВТ КАК ЦеныНоменклатурыПоставщиковВТ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних
ПО ЦеныНоменклатурыПоставщиковВТ.Валюта = КурсыВалютСрезПоследних.Валюта
Показать
(36) Alexey26,
(37) anterehin,
удалось снизить до 1%. Принимаются предложения по оптимизации его производительности)
снизить не удастся скорее всего именно потмоу что попадаются моменты как я эмулировал в (33), с производительностью у Вас все нормально.
(37) anterehin,
Выбрать первые 1
получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
Принимаются предложения по оптимизации его производительности)
Делаете вложенный запрос, в нём два запроса.. первый это номенклатура из табличной части документа, второй
Выбрать первые 1+сортировка по убыванию по периоду и связываете по номенклатуре
m-serg74,
Одна она получится если использовать это условие на запросе Алексея, а если сделать вложенный то он будет выбирать как раз первую для каждой номенклатуры
получится всего одна строка с номенклатурой, а ТСу надо чтоб выбирались несколько номенклатур но записи чтоб не задваивались...
Одна она получится если использовать это условие на запросе Алексея, а если сделать вложенный то он будет выбирать как раз первую для каждой номенклатуры
если из регистра сведений не выбирается в запросе поле то он его учитывать не должен, как ни старалась повторить задвоение так и не удалось. даже без номенклатуры он выбирал последние записи. а если попробовать переименовать таблицу в запросе. Просто пару раз это меня спасало, правда со справочниками такая история была не с регистрами. Предлагаю попробовать Вам, а не сама пробую из-за того что повторить вашу ситуацию не удалось.
ВЫБРАТЬ
КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер,
ФизическиеЛица.Ссылка КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1
ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)
СГРУППИРОВАТЬ ПО
ФизическиеЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Номер
КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер,
ФизическиеЛица.Ссылка КАК ФИО
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1
ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)
СГРУППИРОВАТЬ ПО
ФизическиеЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Номер
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот