Вывести первое изменение актуальной цены

1. user2036184 19.05.24 18:44 Сейчас в теме
Есть периодический регистр сведений с ценами товаров и артикулом
например:
арт дата цена
117105 - 01.02.2022 - 55
117105 - 01.08.2022 - 50
117105 - 01.09.2022 - 55
117105 - 01.10.2022 - 55
124106 - 01.06.2022 - 380
124106 - 15.06.2022 - 400
124106 - 01.07.2022 - 400
124106 - 01.08.2022 - 390
Нужно получить последнюю цену
важно, если для товара установлена одна и та же цена несколько раз подряд (с разными периодами), необходимо выводить самую раннюю дату действия данной цены за указанные периоды.
Правильный ответ такой
арт цена_1 дата_1 цена_2 дата_2
117105 55 01.09.2022. 50 01.08.2022
124106 390 01.08.2022 400 15.06.2022

как с помощью скд добиться такого результата?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. PhoenixAOD 62 22.05.24 02:37 Сейчас в теме
(1)Отбираешь в первой Вт Номеклатура, как тебе надо, либо всю, либо условие ставишь по группе. Выводишь поля Номеклатура и Артикул. Вот второй Вт ЦеныНоменклатуры.СрезПоследних выводишь поля по всей номеклатура, можно так же по аналогичному уловичию как в ВТ1, указываешь в ВТ2 поля которые тебя интересуют и потом к Вт1 присоединяешь левым соединением Вт2 по номенклатуре. И все.
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ Вт1
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.ЭтоГруппа = ЛОЖЬ
	И Номенклатура.ПометкаУдаления = ЛОЖЬ
	И Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(ЦеныНоменклатурыСрезПервых.Период) КАК Период,
	ЦеныНоменклатурыСрезПервых.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыСрезПервых.Цена КАК Цена
ПОМЕСТИТЬ Вт2
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПервых(
			,
			Номенклатура В ИЕРАРХИИ (&Ссылка)
				И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПервых

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатурыСрезПервых.Номенклатура,
	ЦеныНоменклатурыСрезПервых.Цена
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Вт1.Артикул КАК Артикул,
	Вт1.Ссылка КАК Ссылка,
	Вт2.Период КАК Период,
	Вт2.Цена КАК Цена
ИЗ
	Вт1 КАК Вт1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Вт2 КАК Вт2
		ПО Вт1.Ссылка.Ссылка = Вт2.Номенклатура.Ссылка
Показать

Это тебе как пример. Указываешь СрезПоследних, указываешь период который тебя интересует в РС ЦеныНоменклатуры и пошла жара
11. PhoenixAOD 62 22.05.24 03:08 Сейчас в теме
(9)Поторопился. Просто РС ЦеныНоменклатуры укажи, без срезов, указываешь свой период и будут отбираться только цены в которые попадают в твой период
13. homer_ 78 22.05.24 09:47 Сейчас в теме
(11) Где в вашем ШЕДЕВРЕ предыдущая цена.

Правильный ответ такой
арт цена_1 дата_1 цена_2 дата_2
117105 55 01.09.2022. 50 01.08.2022
124106 390 01.08.2022 400 15.06.2022
2. Spirit007 20.05.24 00:40 Сейчас в теме
В СКД в закладке Ресурсы для поля Период : МИНИМУМ(Период) , рассчитать по Артикулу и Цене
Тогда в настройке структуры отчета при группировке по Артикул, Цена выйдет одна строчка с минимальной датой установки цены
3. golem14 21.05.24 12:02 Сейчас в теме
у меня такое же задание
4. soft_wind 21.05.24 13:34 Сейчас в теме
(1) у вас не верный ответ примера!
для товара 117105
нет этой записи - 117105 - 01.02.2022 - 55
по условию вывести цену с датой, и только если несколько цен <подряд> идут, взять первую из этого ряда
5. homer_ 78 21.05.24 13:38 Сейчас в теме

ВЫБРАТЬ
"Товар1" КАК Артикул,
ДАТАВРЕМЯ(2022, 2, 1) КАК Дата,
55 КАК Цена
ПОМЕСТИТЬ мТаб

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 8, 1),
50

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 9, 1),
55

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 10, 1),
55

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 6, 1),
380

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 6, 15),
400

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 7, 1),
400

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 8, 1),
390
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
мТаб.Артикул,
мТаб.Дата,
мТаб.Цена
ПОМЕСТИТЬ м1
ИЗ
мТаб КАК мТаб

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
мТаб.Артикул,
ДАТАВРЕМЯ(2000, 1, 1),
0
ИЗ
мТаб КАК мТаб

СГРУППИРОВАТЬ ПО
мТаб.Артикул
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
м1.Дата,
м1.Цена,
МАКСИМУМ(м11.Дата) КАК Дата1,
м1.Артикул
ПОМЕСТИТЬ м2
ИЗ
м1 КАК м1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ м1 КАК м11
ПО м1.Дата >= м11.Дата
И (НЕ м1.Цена = м11.Цена)
И м1.Артикул = м11.Артикул

СГРУППИРОВАТЬ ПО
м1.Цена,
м1.Дата,
м1.Артикул
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 999
ВложенныйЗапрос.Дата КАК ДатаС,
МАКСИМУМ(м2.Дата) КАК ДатаПо,
м2.Цена,
м2.Артикул КАК Артикул,
ВложенныйЗапрос.Дата1 КАК ДатаПредыдущая
ПОМЕСТИТЬ мИтого
ИЗ
м2 КАК м2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
м2.Артикул КАК Артикул,
м2.Цена КАК Цена,
м2.Дата1 КАК Дата1,
МИНИМУМ(м2.Дата) КАК Дата
ИЗ
м2 КАК м2

СГРУППИРОВАТЬ ПО
м2.Артикул,
м2.Дата1,
м2.Цена) КАК ВложенныйЗапрос
ПО м2.Артикул = ВложенныйЗапрос.Артикул
И м2.Дата1 = ВложенныйЗапрос.Дата1

СГРУППИРОВАТЬ ПО
м2.Цена,
м2.Артикул,
ВложенныйЗапрос.Дата,
ВложенныйЗапрос.Дата1

УПОРЯДОЧИТЬ ПО
Артикул,
ДатаПо
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
мИтого.Артикул,
мИтого.ДатаС,
мИтого.Цена,
мТаб.Дата,
мТаб.Цена КАК Цена1
ИЗ
мИтого КАК мИтого
ЛЕВОЕ СОЕДИНЕНИЕ мТаб КАК мТаб
ПО мИтого.Артикул = мТаб.Артикул
И мИтого.ДатаПредыдущая = мТаб.Дата
Показать
10. PhoenixAOD 62 22.05.24 02:40 Сейчас в теме
(5)Офигенно, БРАВООООО! Я такой дичи давно не видел. особенно соединение по Артикулу, строке, которая в принципе может быть не уникальной или пустым. ГЕНИАЛЬНО!
6. soft_wind 21.05.24 13:51 Сейчас в теме
а так как - Нужно получить последнюю цену
то в ответе всего две строчки должно быть

117105 - 01.09.2022 - 55
124106 - 01.08.2022 - 390
так?
8. user2036184 22.05.24 00:42 Сейчас в теме
(6) нужна самая последняя цена, но если цена менялась на то же значение но с разными периодами, тогда необходимо получить период первого изменения значения цены
7. soft_wind 21.05.24 15:35 Сейчас в теме
логика запроса как бы такая должна быть, помещаем данные во временные таблицы
1.Получаем срез последних (это актуальные цены)
2.Получаем дату предыдущей цены в разрезе товаров (макс дата от таблицы 1 где цены не равны)
3.Получаем дату первой установки текущей цены используя таблицы из п.1 и п.2

тренировался на примере курса валют (очень похожий пример) получился такой запрос
выбрать первые 100
таб.Период,
таб.Валюта,
таб.Курс 
Поместить Пром
из
регистрСведений.КурсыВалют.СрезПоследних таб
;
выбрать
	Пром.Валюта,
	Максимум(ЕстьNull(таб.Период,Пром.Период)) как Дата
поместить табДо	
из
	Пром
левое соединение
	регистрСведений.КурсыВалют таб
по Пром.Валюта = таб.валюта
и Пром.КУрс <> таб.Курс
сгруппировать по
	Пром.Валюта
;
//выбрать * из табДо


Выбрать
ЕстьNull(таб1.Период,Пром.Период) как ПериодС,
Пром.*
из
Пром 
левое соединение табДо 
по Пром.Валюта = табДо.валюта

левое соединение
	регистрСведений.КурсыВалют таб1
по Пром.Валюта = таб1.валюта
и Пром.Курс = таб1.Курс
и ТабДо.Дата <= таб1.Период
и Пром.Период > таб1.Период

левое соединение
	регистрСведений.КурсыВалют таб2
по Пром.Валюта = таб2.валюта
и Пром.Курс = таб2.Курс
и ТабДо.Дата <= таб2.Период
и таб1.Период > таб2.Период

где
таб2.Период есть null
Показать
12. soft_wind 22.05.24 09:43 Сейчас в теме
(8) решение в (7) только свои наименования регистра и реквизитов подставьте
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот