假设我有一个表,其中包含用户 session 、他们在该 session 中访问的页面以及这些页面访问的日期时间。用户应该以正确的顺序访问页面 - 也就是说,他们不应该先浏览第 3 页才能到达第 2 页。
这里(用户 1, session 1)是一个“好” session ,因为她以正确的顺序访问了所有页面。
user_id session_id page_id event_dt
1 1 1 2017-07-04 17:54:40
1 1 2 2017-07-04 17:54:43
1 1 3 2017-07-04 17:54:44
但是(用户 2, session 2)是一个“糟糕的” session ,因为她设法在第 1 页之前以某种方式登陆第 2 页
user_id session_id page_id event_dt
2 2 2 2017-07-04 17:54:47
2 2 1 2017-07-04 17:54:49
2 2 3 2017-07-04 17:54:50
如何使用 SQL 查询确定(用户 1, session 1)是“好” session ,而(用户 2, session 2)是“坏”路径。
附录
我按照 Degan 的建议添加了一个新的 event_dt
列在下面的评论中。
此外,我正在寻找使用 MySQL 的查询,尽管我也希望看到使用 SQL Server(或任何其他包含窗口函数的实现)的查询。
最佳答案
您可以枚举页面两次,一次按页面顺序,一次按日期顺序。然后比较它们:
select t.*
from (select t.*,
(@rn := if(@us = concat_ws(user_id, session_id), @rn + 1,
if(@us := concat_ws(user_id, session_id), 1, 1)
)
) as rn_p
from (select t.*,
(@rn := if(@us = concat_ws(user_id, session_id), @rn + 1,
if(@us := concat_ws(user_id, session_id), 1, 1)
)
) as rn_e
from t cross join
(select @us := '', @rn := 0) params
order by user_id, session_id, event_dt
) t cross join
(select @us := '', @rn := 0) params
order by user_id, session_id, page_id
) t
where rn_e <> rn_p;
关于mysql - 如何知道页面访问是否按预期顺序发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915234/