К сожалению, как вы правильно догадались, вам потребуется поле session_id в вашей модели данных, чтобы точно определить, что каждый пользователь на самом деле уникален.Единственный способ обойти это - установить значение таймера по умолчанию, при превышении которого пользователь сочтет, что он создал новый сеанс, но это очень громоздко, и я не рекомендую это каким-либо образом, так как это создает другие проблемы, и вычисление становится экспоненциальнымтруднее обрабатывать.
Пользователь 1 появляется дважды в вашем примере, что делает очень трудным получение результатов, которые вам нужны, из модели данных в ее нынешнем виде.Любой, кто смотрит на это без ваших результатов, скажет, что user1 потратил 8 часов 20 минут и 30 секунд на систему.
То, чего вы хотите, может быть достигнуто, если session_id был вставлен в таблицу user_events.Затем вы можете найти время, затрачиваемое каждым сеансом пользователя (в секундах), выполнив запрос, подобный приведенному ниже:
SELECT session_id, max(ts) as end_of_session, min(ts) as start_of_session,
(UNIX_TIMESTAMP(max(ts)) - UNIX_TIMESTAMP(min(ts))) as delta_ts
FROM user_events
GROUP BY session_id
ORDER BY session_id
Затем вы можете обернуть его вокруг вызова, который вычисляет среднюю продолжительность для всех уникальных сеансов пользователя.по запросу, подобному приведенному ниже
SELECT avg(delta_ts)
FROM
(
SELECT session_id, max(ts) as end_of_session, min(ts) as start_of_session,
(UNIX_TIMESTAMP(max(ts)) - UNIX_TIMESTAMP(min(ts))) as delta_ts
FROM user_events
GROUP BY session_id
ORDER BY session_id
)q_inner
Этот пример работает так, как вы ожидаете, если в вашу модель будет добавлено поле session_id.
CREATE TABLE `user_events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`session_id` varchar(10) NOT NULL,
`user` varchar(45) DEFAULT NULL,
`page` varchar(45) DEFAULT NULL,
`ts` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `user_events` VALUES
(1,'z1a64','user1','home','2019-03-03 10:00:00'),
(2,'wopa1','user2','home','2019-03-03 10:00:11'),
(3,'z1a64','user1','about','2019-03-03 10:00:23'),
(4,'z1a64','user1','contact','2019-03-03 10:00:47'),
(5,'wopa1','user2','services','2019-03-03 10:01:04'),
(6,'wopa1','user2','contact','2019-03-03 10:01:15'),
(7,'n3dhe','user1','home','2019-03-03 18:20:34'),
(8,'n3dhe','user1','services','2019-03-03 18:20:37');
SELECT avg(delta_ts)
FROM
(
SELECT session_id, max(ts) as end_of_session, min(ts) as start_of_session,
(UNIX_TIMESTAMP(max(ts)) - UNIX_TIMESTAMP(min(ts))) as delta_ts
FROM user_events
GROUP BY session_id
ORDER BY session_id
)q_inner