singalen: (Johnny)
[personal profile] singalen
Нужно выбрать последний, скажем, курс валюты, за каждый час.
Я делаю так:
select *
from currency_course c
where
  c.id in
  (select max(grouped.id) from currency_course grouped where
     grouped.timestamp between :from and :to
     group by year(grouped.timestamp), month(grouped.timestamp), day(grouped.timestamp), hour(grouped.timestamp)
  )

Заодно исполняется и на HQL.

Исполняется, инфекция, разумеется, фулсканом. На MySQL несчастные полторы тыщи записей по этим формулам группируются минуту. На hsql - пять минут.

1. К сожалению, индекс по функции от поля строитс не в каждой СУБД. Не получится написать
create index blabla on currency_course(
year(grouped.timestamp), month(grouped.timestamp), day(grouped.timestamp), hour(grouped.timestamp) )
. А очень жаль.

2. Можно или вынести в отдельную таблицу "дайджест" - уже подготовленные последние записи.

3. Или выставить в таблице currency_course поля-флажки "последний за час/день/неделю", проиндексировать их и выгребать по ним.
Пока собираюсь так.

Кстати, инфекция, в HQL нет функции week(). И произвольного выкусывания части даты тоже нет 8(
Tags:

(no subject)

19/8/09 11:51 (UTC)
Posted by [identity profile] bogdanv.livejournal.com
если нельзя функциональный индекс, то почему не писать в отдельные поля год, месяц, день?

(no subject)

19/8/09 12:02 (UTC)
Posted by [identity profile] rioman.livejournal.com
Можно, но с привлечением таких же дополнительных ресурсов можно решить задачу более эффективно.