Часто бывает так, что несколько дней "подряд" на одну и ту же номенклатуру устанавливают одинаковую цену.
Например, 10/10/2015 цену установили (документом) равной 50р.
И 13/10/2015 то же самое - 50р.
И 15/10/2015 то же самое - 50р.
Других документов по установке цен в этом периоде не было (ни 11, ни 12, ни 14 окт.).
Собственно вопрос - как сделать отчёт/запрос, в котором записей от 13/10 и от 15/10 не было бы (они совершенно лишние). Нужно оставить только 10/10/2015.
1) как вариант самому сформировать необходимую таблицу, и засунуть в скд эту таблицу
2)
ВЫБРАТЬ
ЦеныНоменклатуры.ТипЦен,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
МИНИМУМ(ЦеныНоменклатуры.Регистратор.Дата) КАК РегистраторДата
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
ЦеныНоменклатуры.Номенклатура = &Номенклатура
СГРУППИРОВАТЬ ПО
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.ТипЦен,
ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
ЦеныНоменклатуры.Цена
Показать
По идее в вашем случае должен подойти такой запрос, но в данном запросе есть минус, если цена была например 40 после 50 после 40 после 60, он вам покажет 3 строки 40, 50, 60
ВЫБРАТЬ 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 тИсх.Дата, тИсх.Цена ИЗ тИсх КАК тИсх УПОРЯДОЧИТЬ ПО Дата
Интересная задача. Сжатие. По сути противоположная "цена на каждый день" (интерполяция). Подпишусь. Решение похоже на объединение интервалов (есть в Минимализмах).
(9) ditp, хотя я ошибался насчет объединения интервалов (тут нет промежутков, поэтому решение другое), некоторая глубина в этой задаче есть.
Чуть поразмыслив, можно найти вот такое достаточно короткое решение:
ВЫБРАТЬ
Дано.Дата КАК Дата,
Дано.Цена
ИЗ
Дано КАК Дано
ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Слева
ПО (Слева.Дата < Дано.Дата)
СГРУППИРОВАТЬ ПО
Дано.Дата,
Дано.Цена
ИМЕЮЩИЕ
ЕСТЬNULL(МАКСИМУМ(Слева.Дата), 0) <> ЕСТЬNULL(МАКСИМУМ(ВЫБОР Слева.Цена КОГДА Дано.Цена ТОГДА Слева.Дата КОНЕЦ), 1)
Показать
Или вот еще решение через коррелированный запрос:
ВЫБРАТЬ
Дано.Дата КАК Дата,
Дано.Цена
ИЗ
Дано КАК Дано
ГДЕ
НЕ Дано.Цена В
(ВЫБРАТЬ ПЕРВЫЕ 1
Слева.Цена
ИЗ
Дано КАК Слева
ГДЕ
Слева.Дата < Дано.Дата
УПОРЯДОЧИТЬ ПО
Слева.Дата УБЫВ)
(11) ildarovich, красиво, но не очень практично.
Уже на сотне строк в исходной таблице первый из ваших вариантов по производительности плюс/минус равен моему, а второй начинает изрядно проигрывать.
На тысяче строк последний вариант вообще очень плох.
Замерялку прикладываю.
(12) ditp, вариантов вообще-то много, есть еще тройка как минимум (с двумя группировками, с группировкой и соединением, с поразрядной сортировкой).
Проверять нужно не только на файловой базе. Например, коррелированный запрос хорошо на SQL работает.
Если первый вариант короткий, "красивый" и по производительности плюс-минус равен более длинному, то, наверное, он и практичнее?
Для меня неказистость не синоним практичности.
Кстати, у первого варианта есть чуть более длинная запись(сохраняющая принцип), которая, возможно, будет быстрее.
Все варианты, кроме поразрядной сортировки (!), имеют порядок вычислительной сложности O(N^2). Так что объем данных тоже имеет значение.
Не знаю, стоит ли исследования затевать, задача не слишком популярная. А вариантов решения очень много (еще один с двумя группировками вспомнил).
Из неказистых вариантов я бы выбрал не (7), а классический метод (группировка и соединение), когда во вложенном запросе выбирается максимум предшествующих периодов (работает индекс - экономится половина времени на сканировании второй таблицы), а во внешнем предшествующая цена (для сравнения) выбирается соединением с таблицей регистра цен тоже по индексу. Так срез последних работает.