Отчёт по изменению цен без повторов

1. Ivanovag123 27.10.15 14:21 Сейчас в теме
Часто бывает так, что несколько дней "подряд" на одну и ту же номенклатуру устанавливают одинаковую цену.
Например, 10/10/2015 цену установили (документом) равной 50р.
И 13/10/2015 то же самое - 50р.
И 15/10/2015 то же самое - 50р.
Других документов по установке цен в этом периоде не было (ни 11, ни 12, ни 14 окт.).

Собственно вопрос - как сделать отчёт/запрос, в котором записей от 13/10 и от 15/10 не было бы (они совершенно лишние). Нужно оставить только 10/10/2015.

Желательно в СКД...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Cool_vsi 27.10.15 16:30 Сейчас в теме
1) как вариант самому сформировать необходимую таблицу, и засунуть в скд эту таблицу
2)
ВЫБРАТЬ
	ЦеныНоменклатуры.ТипЦен,
	ЦеныНоменклатуры.Цена,
	ЦеныНоменклатуры.Номенклатура,
	ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
	МИНИМУМ(ЦеныНоменклатуры.Регистратор.Дата) КАК РегистраторДата
ИЗ
	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
	ЦеныНоменклатуры.Номенклатура = &Номенклатура
	

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатуры.Номенклатура,
	ЦеныНоменклатуры.ТипЦен,
	ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
	ЦеныНоменклатуры.Цена
Показать

По идее в вашем случае должен подойти такой запрос, но в данном запросе есть минус, если цена была например 40 после 50 после 40 после 60, он вам покажет 3 строки 40, 50, 60
3. PetroP 27.10.15 16:33 Сейчас в теме
(2) Cool_vsi,

01/10/2015 - 50р.
05/10/2015 - 51р.
10/10/2015 - 50р.
13/10/2015 - 50р.
15/10/2015 - 50р.

Что получим?
4. Cool_vsi 27.10.15 16:34 Сейчас в теме
(3) PetroP, вы абсолютна правы, я это не сразу понял, я это подписал в своем комментарии
5. Ivanovag123 27.10.15 16:45 Сейчас в теме
(2) Cool_vsi, да в том то и дело... Сорри, что сразу не заострил на этом внимание... Так то я и сам бы сделал :))
6. Cool_vsi 27.10.15 16:53 Сейчас в теме
да интересная задачка если в запросе выполнять!
7. ditp 91 27.10.15 16:55 Сейчас в теме
ВЫБРАТЬ	20151001 КАК Дата, 50 КАК Цена ПОМЕСТИТЬ тИсх
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151002, 50
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151003, 50
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151004, 50
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151005, 60
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151006, 60
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151007, 70
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151008, 50
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151009, 70
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151010, 70
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151011, 70
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151012, 80
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 20151013, 80;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МИНИМУМ(т.Дата) КАК Дата, т.Цена
ИЗ
	(ВЫБРАТЬ тИсх.Дата КАК Дата, тИсх.Цена КАК Цена, МАКСИМУМ(тИсх1.Дата) КАК Дата1 ИЗ тИсх КАК тИсх
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ тИсх КАК тИсх1 ПО тИсх.Цена <> тИсх1.Цена И тИсх.Дата >= тИсх1.Дата
	СГРУППИРОВАТЬ ПО тИсх.Дата, тИсх.Цена) КАК т
СГРУППИРОВАТЬ ПО т.Цена, т.Дата1
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 1 тИсх.Дата, тИсх.Цена ИЗ тИсх КАК тИсх УПОРЯДОЧИТЬ ПО Дата
Показать
simgo83; Ivanovag123; Cool_vsi; +3 Ответить
10. Ivanovag123 27.10.15 18:05 Сейчас в теме
(7) ditp, спасибо как всегда! Работает!!!
8. ildarovich 7863 27.10.15 16:57 Сейчас в теме
Интересная задача. Сжатие. По сути противоположная "цена на каждый день" (интерполяция). Подпишусь. Решение похоже на объединение интервалов (есть в Минимализмах).
9. ditp 91 27.10.15 16:58 Сейчас в теме
(8) ildarovich, не очень интересная. Банальное решение на поверхности.
11. ildarovich 7863 27.10.15 23:59 Сейчас в теме
(9) ditp, хотя я ошибался насчет объединения интервалов (тут нет промежутков, поэтому решение другое), некоторая глубина в этой задаче есть.
Чуть поразмыслив, можно найти вот такое достаточно короткое решение:
ВЫБРАТЬ
	Дано.Дата КАК Дата,
	Дано.Цена
ИЗ
	Дано КАК Дано
		ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Слева
		ПО (Слева.Дата < Дано.Дата)
СГРУППИРОВАТЬ ПО
	Дано.Дата,
	Дано.Цена
ИМЕЮЩИЕ
	ЕСТЬNULL(МАКСИМУМ(Слева.Дата), 0) <> ЕСТЬNULL(МАКСИМУМ(ВЫБОР Слева.Цена КОГДА Дано.Цена ТОГДА Слева.Дата КОНЕЦ), 1)
Показать

Или вот еще решение через коррелированный запрос:
ВЫБРАТЬ
	Дано.Дата КАК Дата,
	Дано.Цена
ИЗ
	Дано КАК Дано
ГДЕ
	НЕ Дано.Цена В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Слева.Цена
				ИЗ
					Дано КАК Слева
				ГДЕ
					Слева.Дата < Дано.Дата
				УПОРЯДОЧИТЬ ПО
					Слева.Дата УБЫВ)
Показать
simgo83; Ivanovag123; +2 Ответить
12. ditp 91 28.10.15 09:29 Сейчас в теме
(11) ildarovich, красиво, но не очень практично.
Уже на сотне строк в исходной таблице первый из ваших вариантов по производительности плюс/минус равен моему, а второй начинает изрядно проигрывать.
На тысяче строк последний вариант вообще очень плох.
Замерялку прикладываю.
Прикрепленные файлы:
Отчёт по изменению цен без повторов.epf
13. ildarovich 7863 28.10.15 12:26 Сейчас в теме
(12) ditp, вариантов вообще-то много, есть еще тройка как минимум (с двумя группировками, с группировкой и соединением, с поразрядной сортировкой).
Проверять нужно не только на файловой базе. Например, коррелированный запрос хорошо на SQL работает.
Если первый вариант короткий, "красивый" и по производительности плюс-минус равен более длинному, то, наверное, он и практичнее?
Для меня неказистость не синоним практичности.
Кстати, у первого варианта есть чуть более длинная запись(сохраняющая принцип), которая, возможно, будет быстрее.
Все варианты, кроме поразрядной сортировки (!), имеют порядок вычислительной сложности O(N^2). Так что объем данных тоже имеет значение.
Не знаю, стоит ли исследования затевать, задача не слишком популярная. А вариантов решения очень много (еще один с двумя группировками вспомнил).
Из неказистых вариантов я бы выбрал не (7), а классический метод (группировка и соединение), когда во вложенном запросе выбирается максимум предшествующих периодов (работает индекс - экономится половина времени на сканировании второй таблицы), а во внешнем предшествующая цена (для сравнения) выбирается соединением с таблицей регистра цен тоже по индексу. Так срез последних работает.
simgo83; Ivanovag123; +2 Ответить
Оставьте свое сообщение

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