【问题标题】:Session Duration and Time on Page calculation using SQL使用 SQL 计算会话持续时间和页面停留时间
【发布时间】:2016-04-27 19:15:10
【问题描述】:

我在 Netezza 的 web_event 表中有一些数据,格式如下。

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 查询中做到这一点?

【问题讨论】:

    标签: sql stored-procedures netezza


    【解决方案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 插入它,它不会与任何其他数据发生冲突,可能是“退出”或类似的):

    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
    

    【讨论】:

      【解决方案2】:

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

      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;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2011-07-30
        相关资源
        最近更新 更多