2016-04-27 84 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;