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:37 (UTC)
Posted by [identity profile] rioman.livejournal.com
А, блин. Я идиот. Неправильно прочитал п. 3.
По сути одно и то же, но в таком виде, как в п.3 получается более универсально.