EnChikiben
@EnChikiben

Выбор последнего события за промежуток времени

Добрый день! Помогите (если возможно такое) составить запрос.
Есть таблица с событиями и объектами:
id object_id time type_event
1 1 2013-03-25 02:00:02 1
2 2 2013-03-25 02:30:22 1
3 1 2013-03-25 02:00:12 0
4 2 2013-03-25 02:50:22 0
5 1 2013-03-25 02:45:22 1


нужно получить последнее событие за указанный промежуток времени для объекта, пробовал сортировать по времени и группировать по объекту но не получилось… (результат должен быть для объекта 1 запись 5, а для объекта 2 запись 4)
  • Вопрос задан
  • 4276 просмотров
Пригласить эксперта
Ответы на вопрос 5
denver
@denver
Если я правильно понял, нужно выбрать все даты одним запросом.

SELECT id, MAX(time) FROM table_name
WHERE time BETWEEN '2013-01-01' AND '2014-01-01'
GROUP BY id
Ответ написан
OlegTar
@OlegTar
программист .NET, Javascript, Perl
select * from tablename t1,
(
   select object_id, max(time) as max_time from tablename 
   group by object_id
) as t2
where 
t1.object_id = t2.object_id
and t1.time = t2.max_time
Ответ написан
Комментировать
afiskon
@afiskon
Если я правильно понял вопрос, то

SELECT id FROM table_name WHERE object_id = $OBJECT_ID AND time >= $START_TIME AND time <= $END_TIME ORDER BY time LIMIT 1

Чтобы запрос был эффективным, вам может понадобится (если таблица большая) составной индекс по object_id и time.

Скорее всего time придется взять в кавычки, смотря что за СУБД.
Ответ написан
weirdan
@weirdan
В зависимости от объема выборки, может иметь смысл сделать через временную таблицу с unique index:
create temporary table tablename_uniq like tablename;
alter table tablename_uniq 
  add column record_date date, 
  add unique index (object_id, record_date);
insert ignore into tablename_uniq 
  select id, object_id, time, type_event, cast(time as date) 
  from tablename 
  /* where time between @range_start and @range_end */ 
  order by time desc;
select id, object_id, time, type_event from tablename_uniq;
drop temporary table tablename_uniq;
Ответ написан
Комментировать
@okashirin
select * from event as t1
where time = (select max(time) from event where object_id = t1.object_id group by object_id)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы