2016-04-27 72 views
0

我在以下格式的Netezza的web_event表中有一些数据。使用SQL计算页面的会话持续时间和时间

vstr_id | sessn_id | sessn_ts   | wbpg_nm 
V1  | V1S1  | 02-02-2015 09:20:00 | /home/login 
V1  | V1S1  | 02-02-2015 09:30:00 | /home/contacts 
V1  | V1S1  | 02-02-2015 09:50:00 | /home/search 
V2  | V2S1  | 02-02-2015 09:10:00 | /home 
V2  | V2S1  | 02-02-2015 09:15:00 | /home/apps 
V2  | V2S2  | 02-02-2015 09:20:00 | /home/news 
V2  | V2S2  | 02-02-2015 09:23:00 | /home/news/internal 

这是我的源表。

我想使用该web_event表并创建像下面这样的另一个表。

我想要像下面那样加载sessn_durtn表和time_on_pg表。

1)sessn_durtn列:根据排序时间字段,这应该是会话开始事件和会话结束事件之间的时间差。它可以是表示以分钟或秒

I am trying to to do 

Insert into sessn_durtn (select VSTR_ID, 
      SESSN_ID, 
      ????? as sessn_durtn, 
      from web_event) 

vstr_id | sessn_id | seesn_durtn 
V1  | V1S1  | 30mins  
V2  | V2S1  | 5mins     
V2  | V2S2  | 3mins   

2)time_on_page柱:它是当前页和下一页和会话的最后一页之间的时间差可以具有0秒。它可以用几分钟或几秒来表示。

Insert into time_on_pg (select VSTR_ID, 
      SESSN_ID, 
      sessn_ts, 
      WBPG_NM, 
      ????? as time_on_page 
      from web_event) 

vstr_id | sessn_id | sessn_ts   | wbpg_nm    | time_on_page 
V1  | V1S1  | 02-02-2015 09:20:00 | /home/login   | 10mins 
V1  | V1S1  | 02-02-2015 09:30:00 | /home/contacts  | 20mins 
V1  | V1S1  | 02-02-2015 09:50:00 | /home/search   | 0mins 
V2  | V2S1  | 02-02-2015 09:10:00 | /home    | 5mins 
V2  | V2S1  | 02-02-2015 09:15:00 | /home/apps   | 0mins 
V2  | V2S2  | 02-02-2015 09:20:00 | /home/news   | 3mins 
V2  | V2S2  | 02-02-2015 09:23:00 | /home/news/internal | 0mins 

我们如何在Netezza或任何SQL查询中做到这一点?

回答

1

对于会话持续时间:

SELECT vstr_id, MAX(sessn_ts), MIN(sessn_ts), 
TIMESTAMPDIFF(MINUTE,MIN(sessn_ts),MAX(sessn_ts)) AS sessn_durtn 
FROM `web_event` 
GROUP BY vstr_id, sessn_id 

而对于页面上的时间(你没有他们离开时间的记录,所以我不能让页面停留时间过去所以我只是将它设置为0.如果你有这些数据,你可以插入一个固定的wbpg_nm,它不会与其他任何人碰撞,或许是'exit'或者其他的):

SELECT t1.*, 
IFNULL(TIMESTAMPDIFF(MINUTE, t1.sessn_ts, t2.sessn_ts), 0) AS time_on_pg 
FROM 
(
    SELECT w1.*, 
    @rownum := @rownum + 1 AS position 
    FROM `web_event` w1 
    JOIN (SELECT @rownum := 0) r 
    ORDER BY vstr_id, sessn_id, sessn_ts 
) t1 
LEFT JOIN 
(
    SELECT w1.*, 
    @rownum2 := @rownum2 + 1 AS position 
    FROM `web_event` w1 
    JOIN (SELECT @rownum2 := 0) r 
    ORDER BY vstr_id, sessn_id, sessn_ts 
) t2 
ON t1.vstr_id = t2.vstr_id 
AND t1.sessn_id = t2.sessn_id 
AND t1.position = t2.position - 1 
0

非常感谢您的时间和精力。

Sessn_duration是正确的,它工作正常。

对于页面上的时间这是一个更简单的工作答案。

SELECT vstr_id, 
     sessn_id, 
     extract(epoch from (lag(event_ts) over (partition by vstr_id, sessn_id order by event_ts DESC) - event_ts)) AS tm_on_pg, 
     wbpg_nm 

from pagepath_poc;