我有一个表,用来存储用户不同会话的记录(订阅、取消订阅、离开、在线)。我必须计算每一次会议的持续时间。我可以使用滞后期()函数获得前一行,但是滞后()使用偏移量,而且我不知道偏移量是什么。我必须得到前一行where event NOT IN ('subscribe', 'unsubscribe')
。与附件中的图像一样,对于带有事件订阅的第8行,前一行应该是第4行,其中包含事件消失。我正在使用MYSQL的最新版本。
到目前为止,我编写了mysql查询,得到了结果,但是我希望根据条件获得前一行,而不是将一个硬编码的偏移量设置为2中的滞后()函数。
select * from (
select `id`, `user_id`, `event`, `created_at`,
date(created_at) as date,
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, created_at, LEAD(created_at) OVER (PARTITION BY user_id ORDER BY created_at))) as duration,
LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) AS previous_event,
CASE
WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) = 'away' THEN 'away'
WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) = 'online' THEN 'online'
WHEN event = 'subscribe' and LAG(event,2) OVER (PARTITION BY user_id ORDER BY created_at) IS NULL THEN 'online'
ELSE event END as status
from `user_websocket_events` where event in ('online','away','unsubscribe','subscribe') and created_at between '2022-04-06 00:00:00' and '2022-04-07 23:59:59' and user_id in(19)
) as `Developer`
where created_at between '2022-04-06 00:00:00' and '2022-04-06 23:59:59';
#data for testing
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9606, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9609, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9610, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9611, 19, 'away');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9613, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9614, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9616, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9618, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9634, 19, 'online');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9635, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9636, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9637, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9638, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9639, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9640, 19, 'subscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9641, 19, 'away');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9642, 19, 'unsubscribe');
INSERT INTO user_websocket_events (id, user_id, event) VALUES (9643, 19, 'subscribe');
发布于 2022-04-22 00:52:35
请参见下一个查询:
SELECT *,
SUM(event NOT IN ('subscribe', 'unsubscribe')) OVER (ORDER BY id) group_no
FROM user_websocket_events
ORDER BY 1
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=d313c095f5c034a0a03cf70defd8344a
此查询将行集划分为组,每个组从一个不是“订阅”或“取消订阅”的事件开始。
因此,对于任何行,您都可以很容易地找到上一行的id
值,其中event NOT IN ('subscribe', 'unsubscribe')
具有简单的MIN(id) OVER (PARTITION BY group_no)
。当然是非零组号。
https://stackoverflow.com/questions/71964297
复制