Показать сообщение отдельно
Старый 11.11.2011, 11:50   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Borsugg Посмотреть сообщение
А если не затруднит, можно поподробнее, что под нужными индексами подразумеваете?
Не обязательно пытаться все впихнуть в один запрос. В смысле, получить сразу результат. Может быть проще будет анализировать выборку. Ведь вряд ли будет очень уж большое количество записей в истории изменения цен для одного артикула и склада.

X++:
FromDate fromDate = 05\01\2011;
ToDate toDate = 20\02\2011;
newPrice minNewPrice = maxInt();
;

while select NewPrice, TransDate
	from RetailItemPriceHistory
	order by TransDate desc
	where RetailItemPriceHistory.ItemId            ==  itemId
		&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
		&& RetailItemPriceHistory.TransDate         <=  toDate
		&& RetailItemPriceHistory.NewPrice
{
	minNewPrice = min(minNewPrice, RetailItemPriceHistory.NewPrice);
	// Сравнение с начальной датой ПОСЛЕ вычисления значения
	// чтобы учесть цену, указанную ДО начальной даты
	if (RetailItemPriceHistory.TransDate <= fromDate)
	{
		break;
	}
}

if (minNewPrice == maxInt())
{
	// На дату окончания периода нет цены
	minNewPrice = 0;
}
Если же все-таки хочется все в одном запросе, то проблема заключается в том, что необходимо уточнить дату начала периода. Т.е. изменить начальную дату, если в истории есть запись с датой меньше указанной, но нет записи с датой равной указанной.

X++:
FromDate fromDate = 05\01\2011;
ToDate toDate = 20\02\2011;
;

// Уточняем "начальную дату"
select firstonly TransDate
from RetailItemPriceHistory
order by TransDate desc
where RetailItemPriceHistory.ItemId            ==  itemId
	&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
	&& RetailItemPriceHistory.TransDate         <=  fromDate 
	&& RetailItemPriceHistory.NewPrice;

// Если есть запись с датой меньше начальной и нет записи с датой
// равной начальной, то начальной датой считаем найденное значение
if (RetailItemPriceHistory.TransDate < fromDate)
{
	fromDate = RetailItemPriceHistory.TransDate;
}

// Теперь собственно запрос
select minOf(NewPrice) 
from RetailItemPriceHistory
where  RetailItemPriceHistory.ItemId            ==  itemId
	&& RetailItemPriceHistory.InventLocationId  ==  InventLocationId
	&& RetailItemPriceHistory.TransDate         >=  fromDate
	&& RetailItemPriceHistory.TransDate         <=  toDate
	&& RetailItemPriceHistory.NewPrice;
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Borsugg (1).