输入表:
Visitor Page Visited TimeStamp
A P1 6:41:21
A P1 6:41:35
A P2 6:42:54
A P2 6:43:53
A P1 6:44:09
A P1 6:44:54
我必须找到访问者的旅程(在这种情况下,访问者' A'将打开P1页面然后P2再次返回P1)页面级别及其开始时间戳(在该页面上) )和结束时间戳(在该页面上)
每一行都是访问者在一个页面上执行的特定活动,该活动被记录为点击,因此每一行代表一个带时间戳的点击。
输出表应如下所示:
Visitor Page Visited StartTime EndTime
A P1 6:41:21 6:41:35
A P2 6:42:54 6:43:53
A P1 6:44:09 6:44:54
答案 0 :(得分:1)
尝试此查询。我使用this精彩的博客文章来构建查询。
基本上,它使用MySQL用户定义的变量来跟踪状态变化(我将“状态”视为访客+页面的组合),同时按时间戳排序整个表,然后按页面和访问者排序(即状态) 。每当状态改变时,计数器gn
递增1。然后,外部查询只选择时间戳的最小值和最大值作为开始和结束,同时按gn
进行分组。
我的测试数据表名为dummy
,与源表对应的列为visitor, pg, visited
。为简单起见,我对所有3列使用了char
数据类型,将时间戳列转换为订购时的时间等。您可以将其存储为datetime
类型,这将消除转换的需要。
为了将来参考,这也被称为“岛屿问题”。您可以使用其他方法谷歌查找更多解决方案。
SELECT visitor AS Visitor, pg as 'Page Visited', MIN(visited) AS StartTime, max(visited) as EndTime
FROM (
SELECT @r := @r + (@state != concat(visitor,concat('->',pg)) OR @state IS NULL) AS gn,
@state := concat(visitor,concat('->',pg)) AS sn,
s.visitor, convert(s.visited, TIME) as visited, s.pg
FROM (
SELECT @r := 0,
@state := NULL
) vars,
dummy s
ORDER BY
convert(visited, TIME), pg, visitor
) q
group by gn, pg, visitor
SQL小提琴,您可以在其中检查我的源数据和查询输出:http://sqlfiddle.com/#!9/b41758/4/0
答案 1 :(得分:0)
也许这会更容易。
SELECT Visitor, pageVisited as 'Page Visited', min(timestampTemp) StartTime,
max(timestampTemp) EndTime from
(select @pvt:= @pvt+(@pv!=a.pageVisited) pvt,@pv:=a.pageVisited,a.* from
(select @pv:='', @pvt:=0) vars, testTab a order by visitor,timestampTemp) t
group by t.pvt, t.visitor;