Цитата:
Сообщение от
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;