使用 SQL 计算会话持续时间和页面停留时间
Session Duration and Time on Page calculation using SQL
我在 Netezza 的 web_event table 中有一些数据,格式如下。
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
这是我的来源table。
我正在尝试使用 web_event table 并创建另一个 table,如下所示。
我希望 sessn_durtn table 和 time_on_pg table 像下面这样加载。
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 查询中执行此操作?
会话持续时间:
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
非常感谢您的时间和精力。
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
来自 pagepath_poc;
我在 Netezza 的 web_event table 中有一些数据,格式如下。
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
这是我的来源table。
我正在尝试使用 web_event table 并创建另一个 table,如下所示。
我希望 sessn_durtn table 和 time_on_pg table 像下面这样加载。
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 查询中执行此操作?
会话持续时间:
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
非常感谢您的时间和精力。
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
来自 pagepath_poc;