как лучше реализовать агрегатный first / last
Добавлено: 25 окт 2007, 19:31
Проблема в общем классическая, но хорошего решения до сих пор не нашёл. Есть три связанных таблицы, из которых нужно выбрать на каждый день последнюю (в смысле соответствующую наибольшему времени в рамках текущего дня) цену по каждой группе товара. Приблизительно так
тока есессно этот запрос выбирает максимальную цену вместо последней. добавить к нему ордер и агрегатный first и всё было бы готово. а так перебрасываем это дело во вьюшник и получаем
т.е. в принципе результат получили. но для для второго запроса кол-во обращений прилично выросло, с десятков до тысяч на тестовой выборке. учитывая что этот запрос крутиться в цикле то радости совсем мало. насколько я понимаю кроме такого варианта остаётся тока хп. но я сильно сомневаюсь что хп отработает быстрее. всё таки через индексы оптимизация запроса своё даст, а там в лоб циклом всё перебирать и джойнить результат дальше... на форуме чёт ничего такого не нашёл, кроме http://forum.ibase.ru/phpBB2/viewtopic.php?t=2164 но и там как-то не много чего полезного оказалось...
в общем, буду благодарен за советы или идеи
з.ы. fb2, индексы по всем используемым полям
з.ы.ы. я плохо искал или я реально один с такой проблемой? если не один тогда почему first/last не были реализованы? а если один, тогда я не понимаю как можно переделать архитектуру базы, чтобы решить эту задачу без лишнего гемора...
В общем, заранее спасибо...
Код: Выделить всё
select cast(pr."prt_date" as DATE) as "prt_date", p."pst_puid", max(p."pst_cost")
from PRICE_RELATIONS pr
inner join PRICES pp on (pr."prt_price" = pp."prc_id")
inner join POSITIONS p on (p."pst_price" = pp."prc_id")
where (pr."prt_date" >= :"fdate") and (pr."prt_date" <= :"todate")
group by cast(pr."prt_date" as DATE), p."pst_puid"
Код: Выделить всё
select cast(v."prt_date" as DATE) as "prt_date", p."pst_puid",
( select first 1 v2."pst_cost"
from VW_GROUPED_POSITIONS v2
where (cast(v."prt_date" as DATE) = cast(v2."prt_date" as DATE))
and (v."pst_puid" = v2."pst_puid")
order by v2."prt_date" desc
)
from VW_GROUPED_POSITIONS v
where (v."prt_date" >= :"fdate") and (v."prt_date" <= :"todate")
group by cast(v."prt_date" as DATE), v."pst_puid";
в общем, буду благодарен за советы или идеи
з.ы. fb2, индексы по всем используемым полям
з.ы.ы. я плохо искал или я реально один с такой проблемой? если не один тогда почему first/last не были реализованы? а если один, тогда я не понимаю как можно переделать архитектуру базы, чтобы решить эту задачу без лишнего гемора...
В общем, заранее спасибо...