powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с подсчетом времени по таблице
16 сообщений из 16, страница 1 из 1
Помогите пожалуйста с подсчетом времени по таблице
    #39945951
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые!!!
Подскажите пожалуйста как в MySQL посчитать суммарную продолжительность сеансов по пользователю в течении дня...
На клиенте нет возможности, увы. С MySQL раньше не работал, курсором сходу не получилось сделать.
"version" "5.7.29-0ubuntu0.18.04.1"

Табличка простая.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `frtsmon` (
	`login_id` BIGINT(20) NOT NULL,
	`tm` DATETIME NOT NULL,
	`type` SMALLINT(6) NOT NULL,
	`user_name` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
	`caption_text` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
	`computer_id` SMALLINT(6) NOT NULL,
	UNIQUE INDEX `login_id_tm_type_computer_id` (`tm`, `login_id`, `type`, `computer_id`) USING BTREE,
	INDEX `PRIMARY KEY` (`login_id`) USING BTREE
)
COMMENT='Ifo from ts.monitor'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;


Сеансов за день может быть много, они из разных офисов (caption_text) и на разные компьютеры (computer_id). Признак начала сеанса значение (type) = 1, заканчивается значением 2.
Вывести юзера, самое ранее время по "caption_text", самое позднее и сумму сеансов по этому "caption_text". Компьютер, с которым соединяются (computer_id) не важен, в течении дня их может быть много разных, в течение сеанса его значение не меняется.
Кусочек данных:
Таблица frtsmon
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242557, '2020-03-11 00:03:23', 1, 'user2', 'OFFICE1', 3);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242561, '2020-03-11 00:15:39', 1, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242563, '2020-03-11 00:18:18', 2, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242564, '2020-03-11 00:20:39', 1, 'user1', 'OFFICE2', 3);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242566, '2020-03-11 00:23:19', 2, 'user1', 'OFFICE2', 3);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242568, '2020-03-11 00:24:20', 1, 'user1', 'OFFICE1', 6);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242569, '2020-03-11 00:28:01', 2, 'user1', 'OFFICE1', 6);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242570, '2020-03-11 00:30:36', 1, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242571, '2020-03-11 00:33:16', 2, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242573, '2020-03-11 00:34:06', 1, 'user3', 'OFFICE1', 4);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242574, '2020-03-11 00:35:36', 1, 'user1', 'OFFICE2', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242575, '2020-03-11 00:38:16', 2, 'user1', 'OFFICE2', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242576, '2020-03-11 00:39:06', 1, 'user1', 'OFFICE1', 2);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242577, '2020-03-11 00:43:16', 2, 'user4', 'OFFICE2', 5);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1242578, '2020-03-11 00:43:16', 2, 'user1', 'OFFICE1', 2);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1243578, '2020-03-11 00:45:35', 1, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1243579, '2020-03-11 00:48:14', 2, 'user1', 'OFFICE1', 7);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1243586, '2020-03-11 01:11:10', 2, 'user4', 'OFFICE2', 5);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1243596, '2020-03-11 01:11:10', 2, 'user3', 'OFFICE1', 4);
INSERT INTO "frtsmon" ("login_id", "tm", "type", "user_name", "caption_text", "computer_id") VALUES (1243630, '2020-03-11 01:49:08', 2, 'user2', 'OFFICE1', 3);
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39945989
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL
Кусочек данных:

Структуру и данные лучше представлять в виде fiddle .

Вот сразу и скажи - что должно получиться для пользователя user4?
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946007
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, возможно у USER4 съехал тип при копировании. Посмотрел в базе, там 1 и 2. Возможен и переход через ночь, сеанс может начаться в один день, а закончиться в следующий...
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946008
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL
Akina, возможно у USER4 съехал тип при копировании. Посмотрел в базе, там 1 и 2.
А правда, как обрабатывать неконсистентные данные?
Сеансы без начала? Сеансы без конца? Пересекающиеся по времени сеансы?
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946010
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL,

И как вообще связаны записи одного сеанса?
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946030
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, в запросе не знаю.
На клиенте я бы обрабатывал ошибку четности количества строк с группировкой по юзеру. И при нечетном уходил бы на отдельные запросы поиска минимального/максимального по типам, с присвоением 00:00 или 23:59 на краях "дырок". Два сеанса на одном computer_id физически не начнутся, пересечения по времени исклечены, но если все же "потеряется" строка с типом, искать ближайшую по времени противоположного типа и принимать ее за начало/конец.
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946037
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT t1.user_name,
       DATE(t1.tm) `date`,
       MIN(t1.tm),
       MAX(t2.tm),
       SUM(TIMESTAMPDIFF(SECOND, t1.tm, t2.tm)) delta
FROM frtsmon t1, frtsmon t2 
WHERE t1.user_name = t2.user_name
  AND t1.caption_text = t2.caption_text
  AND t1.computer_id = t2.computer_id
  AND DATE(t1.tm) = DATE(t2.tm)
  AND t1.tm < t2.tm
  AND t1.type = 1
  AND t2.type = 2
  AND NOT EXISTS ( SELECT NULL 
                   FROM frtsmon t3
                   WHERE t1.user_name = t3.user_name
                     AND t1.caption_text = t3.caption_text
                     AND t1.computer_id = t3.computer_id
                     AND DATE(t1.tm) = DATE(t2.tm)
                     AND t1.tm < t3.tm 
                     AND t3.tm < t2.tm )
GROUP BY t1.user_name, DATE(t1.tm);


fiddle .
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946039
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
IgorL,
И как вообще связаны записи одного сеанса?

Сеанс user_name начинается с type=1 и заканчивается type=2. computer_id = computer_id в пределах одного сеанса.
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946044
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL
с присвоением 00:00 или 23:59 на краях "дырок"
Т.е. переходов через полночь быть не может?
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946102
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Спасибо! Сам бы я до такого точно не додумался. (
Скорости бы ему еще, на месячных данных конца не дождался, отрезал в отдельную табличку сутки, ее за 10 секунд на i5 перемолол.
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946103
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
IgorL
с присвоением 00:00 или 23:59 на краях "дырок"
Т.е. переходов через полночь быть не может?

Может конечно. Но "отбивка" сутки, что бы не получалось больше 24 часов лучше обрезать по 00:00...23:59.
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946134
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL
Скорости бы ему еще
Индекс создайте... (user_name, caption_text, computer_id, tm) .

Если логика допускает - выбросите из запроса (и индекса) caption_text .
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946312
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
в таблице уже есть индекс и explain показывает что он используется. Убрал поле caption_text из запроса, прибавки скорости практически не заметил. За сутки отрабатывает нормально, сделал процедуру копирования выборки за сутки в отдельную табличку и по ней считаю.
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946316
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL
в таблице уже есть индекс
Какой именно? который в первом посте показан? да он ниачём в этом запросе...
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946352
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Какой именно? который в первом посте показан? да он ниачём в этом запросе...

Этот
UNIQUE INDEX `login_id_tm_type_computer_id` (`tm`, `login_id`, `type`, `computer_id`) USING BTREE
Почему ниочем? Я не силен в MySQL, но все поля, по которым идет основная выборка перечислены, или у MySQL UNIQUE INDEX не участвует select ?
...
Рейтинг: 0 / 0
Помогите пожалуйста с подсчетом времени по таблице
    #39946355
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порядок полей в индексе важен ничуть не меньше, чем набор полей.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с подсчетом времени по таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]