Просто подумал, что это может быть полезно для всех, кто сталкивался с той же проблемой.
Я начал с добавления столбца auto_increment visit_id
в таблицу visits_times
, упорядоченную по полю visit_date
.
Идея состоит в том, чтобы получить visit_id
, ближайшее к st.spot_date
и st.spot_date + interval 10 minute
. Затем вычтите visit_id
, которое должно быть общим количеством посещений между диапазоном.
Создана функция для возврата visit_id
для даты и интервала. Функция использует индекс visit_date
и выполняет цикл до тех пор, пока не найдет запись, добавляющую секунду на каждые l oop.
DELIMITER //
DROP function IF EXISTS `spot_time_function` //
CREATE function `spot_time_function`( p_datetime datetime, p_time int)
returns int
BEGIN
declare v_id int ;
declare z int;
set z = 0;
time_loop: LOOP
select visit_id into v_id from visit_times where visit_date = p_datetime + interval p_time minute + interval z second limit 1;
IF v_id is not null THEN
LEAVE time_loop;
END IF;
SET z = z + 1;
END LOOP;
return v_id;
END //
DELIMITER ;
Итак, окончательный запрос выглядит так.
Select
spot_date,
spot_time_function(spot_date,10) - spot_time_function(spot_date,0) as total_visit
From spot_times;
Вышеуказанный запрос выполняется за 0,110 se c.