這是我的activities
桌子。
activities
+----+---------+----------+-----------------+
| id | user_id | activity | log_time |
+----+---------+----------+-----------------+
| 6 | 1 | start | 12 Oct, 1000hrs |
| 2 | 1 | task | 12 Oct, 1010hrs |
| 7 | 1 | task | 12 Oct, 1040hrs |
| 3 | 1 | start | 12 Oct, 1600hrs |
| 1 | 1 | task | 12 Oct, 1610hrs |
| 9 | 1 | start | 14 Oct, 0800hrs |
| 10 | 1 | start | 16 Oct, 0900hrs |
| 4 | 1 | task | 16 Oct, 0910hrs |
| 8 | 2 | start | 12 Oct, 1000hrs |
| 5 | 2 | task | 12 Oct, 1020hrs |
+----+---------+----------+-----------------+
我需要用戶在所有會話中花費的總時間。每個會話在一天內發生,包括一個“開始”和多個“任務”(在下一個會話以“開始”啟動之前)。一個會話持續時間=最後一個任務-開始[時間戳差異]
output
+---------+------------+------------------------------------------------+
| user_id | total_time | This is explanation (not a column) |
+---------+------------+------------------------------------------------+
| 1 | 60 | 12_Oct[40+10] + 14_Oct[0] + 16_Oct[10] = 60min |
| 2 | 20 | 12_Oct[20] = 20min |
+---------+------------+------------------------------------------------+
我無法弄清楚如何獲得會話中的最後一個任務。我已經嘗試了基本的聚合和連接查詢 - 但它不起作用。
作為一種方法,我認為我真正需要的是以某種方式獲取最後一列(下面/ session_group),然後我可以匯總並獲得最大/最小時間戳之間的差異。
+----+---------+----------+-----------------+---------------+
| id | user_id | activity | log_time | session_group |
+----+---------+----------+-----------------+---------------+
| 6 | 1 | start | 12 Oct, 1000hrs | 1 |
| 2 | 1 | task | 12 Oct, 1010hrs | 1 |
| 7 | 1 | task | 12 Oct, 1040hrs | 1 |
| 3 | 1 | start | 12 Oct, 1600hrs | 2 |
| 1 | 1 | task | 12 Oct, 1610hrs | 2 |
| 9 | 1 | start | 14 Oct, 0800hrs | 3 |
| 10 | 1 | start | 16 Oct, 0900hrs | 4 |
| 4 | 1 | task | 16 Oct, 0910hrs | 4 |
| 8 | 2 | start | 12 Oct, 1000hrs | 5 |
| 5 | 2 | task | 12 Oct, 1020hrs | 5 |
+----+---------+----------+-----------------+---------------+
請讓我知道是否有可能通過 sql (MySQL) 獲得所需的輸出以及如何進行?或者是否有必要通過 Javascript 遍歷數據?
以下是表的 MySQL 查詢:
create table activities (
id INT NOT NULL,
user_id INT NULL,
activity VARCHAR(45),
log_time DATETIME NOT NULL DEFAULT NOW(),
PRIMARY KEY(id))
ENGINE = InnoDB;
insert into activities
(id, user_id, activity, log_time)
values
(6,1,'start', '2021-10-12 10:00:00'),
(2,1,'task' , '2021-10-12 10:10:00'),
(7,1,'task' , '2021-10-12 10:40:00'),
(3,1,'start', '2021-10-12 16:00:00'),
(1,1,'task', '2021-10-12 16:10:00'),
(9,1,'task', '2021-10-14 08:00:00'),
(10,1,'start','2021-10-16 09:00:00'),
(4,1,'task', '2021-10-16 09:10:00'),
(8,2,'start', '2021-10-12 10:00:00'),
(5,2,'task', '2021-10-12 10:20:00');
您可以使用SUM()
窗口函數為每個會話分配一個編號,然後進行聚合:
SELECT DISTINCT user_id,
SUM(TIMESTAMPDIFF(MINUTE, MIN(log_time), MAX(log_time))) OVER (PARTITION BY user_id) total_time
FROM (
SELECT *, SUM(activity = 'start') OVER (PARTITION BY user_id, DATE(log_time) ORDER BY log_time) grp
FROM activities
) t
WHERE grp > 0
GROUP BY user_id, DATE(log_time), grp;
請參閱演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句