Подсчет записей с начальными и конечными полями, которые охватывают данное значение - PullRequest
3 голосов
/ 03 марта 2011

Предположим, у меня есть таблица (MySQL), подобная этой:

CREATE TABLE sessions (
    session_id INT NOT NULL AUTO_INCREMENT,
    name CHAR(12),
    start INT,
    end INT,
    PRIMARY KEY (session_id)
)

для отслеживания пользователей, вошедших в приложение. Каждое имя пользователя создает в этой таблице запись, задающую время начала (в виде целого числа, считая секунды с эпохи Unix), а выход из системы обновляет эту таблицу, устанавливая время окончания аналогичным образом. Моя проблема заключается в том, чтобы найти количество зарегистрированных пользователей с пятиминутными интервалами за определенный промежуток времени (обычно за день).

На данный момент я написал процедуру, которая перебирает данные.

SET t = begin_time;
WHILE t <= end_time DO
    SELECT t, COUNT(1) FROM TABLE WHERE start <= t AND end >= t;
    SET t = t + 300;
END WHILE;

Это довольно много времени; Я ищу альтернативные решения для этой проблемы. Веб-ссылки, указатели - любая помощь подойдет.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Я думаю, вам понадобится помощь таблицы чисел, чтобы выполнить правильное профилирование для каждого момента времени в соответствии с заданным диапазоном времени и интервалом между моментами времени.

Вот возможное решение:

SET begin_time = ...
SET end_time = ...
SET interval_sec = 300;

CREATE TEMPORARY TABLE timestamps (unixtime int);
SET t = (begin_time + interval_sec - 1) div interval_sec;
WHILE t <= end_time DO
  INSERT INTO timestamps (unixtime) VALUES (t);
  SET t = t + interval_sec;
END WHILE;

SELECT
  t.unixtime,
  COUNT(s.session_id)
FROM timestamps t
  LEFT JOIN sessions s ON t.unixtime >= s.start AND t.unixtime < s.end;
GROUP BY t.unixtime

3-я строка удостоверяет, что все профилируемые метки времени являются началом 5-минутных интервалов в соответствии со шкалой времени.Если вы хотите, чтобы они основывались на начале указанного временного диапазона, измените его просто на SET t = begin_time;.

. Это решение подсчитывает активные сеансы в указанные моменты времени.Если для пользователя возможно иметь несколько одновременных сеансов, и вы хотите знать, сколько отдельных пользователей было в сети, вам следует заменить COUNT(s.session_id) на COUNT(DISTINCT s.name).

0 голосов
/ 03 марта 2011
SELECT (end-start)-(end-start)%300, COUNT(1) FROM session GROUP BY 1 ORDER BY 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...