如何使用mySQL从输入表中获取输出表?

时间:2017-10-31 05:13:35

标签: mysql sql

输入表:

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  

2 个答案:

答案 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;

http://sqlfiddle.com/#!9/0cca99/1/0