对用户行为记录进行物理切分session

背景

需要对用户的访问日志记录进行转化分析,由于日志记录没有业务session,需要物理地对访问记录进行session切分,规则是30分钟内的用户操作为一个会话(session),如果两个操作之间的时间间隔超过30分钟,则判定为两个session。
环境:GreenPlum(postgresql)

数据

/*
用户ID:bid
访问时间:event_time
页面key:event_key
*/
WITH log_data AS(
    SELECT
        bid,
        event_time::TIMESTAMP AS event_time,
        event_key,
        /* 访问序号 */
        ROW_NUMBER() OVER(PARTITION BY bid ORDER BY event_time) AS num
    FROM
    (
        SELECT '123' AS bid, '2017-11-20 10:01:56' AS event_time, 'page1' AS event_key
        UNION ALL
        SELECT '123' AS bid, '2017-11-20 10:05:56' AS event_time, 'page2' AS event_key
        UNION ALL
        SELECT '123' AS bid, '2017-11-20 10:43:56' AS event_time, 'page1' AS event_key
        UNION ALL
        SELECT '123' AS bid, '2017-11-20 10:46:56' AS event_time, 'page2' AS event_key
        UNION ALL
        SELECT '123' AS bid, '2017-11-20 10:49:56' AS event_time, 'page3' AS event_key
    )tmp
)
SELECT * FROM log_data;
图一

切分session过程

需要找到一个记录A的时间减去上一个记录B的时间差值大于30分钟,如下图中,需要找到箭头指向的那条10:43:56访问的记录

图二

问题转化为寻找每个session的起始访问记录,详细sql如下:

SELECT
    t1.*,
    t2.num,
    /* 如果记录为首次或两个记录时间差大于30分钟则打上标记 */
    CASE WHEN t2. event_time is NULL OR t1.event_time - t2.event_time > INTERVAL '30 minute' THEN t1.num ELSE null END AS time_diff
FROM
    log_data t1
LEFT JOIN
    /* 前后记录关联 */
    log_data t2 on t1.bid = t2.bid AND t1.num = t2.num + 1

根据t1.bid = t2.bid AND t1.num = t2.num + 1关联得到切分点的num,如下图中的time_diff


图三

通过time_diff is not null 得到具体的切分点

SELECT
    bid,
    time_diff,
    event_time
FROM
    (
    SELECT
        t1.*,
        t2.num,
        /* 如果记录为首次或两个记录时间差大于30分钟则打上标记 */
        CASE WHEN t2. event_time is NULL OR t1.event_time - t2.event_time > INTERVAL '30 minute' THEN t1.num ELSE null END AS time_diff
    FROM
        log_data t1
    LEFT JOIN
        /* 前后记录关联 */
        log_data t2 on t1.bid = t2.bid AND t1.num = t2.num + 1
    )t02
WHERE 
    t02.time_diff IS NOT NULL
图四

图一跟图四通过t01.bid = t02.bid AND t01.num >= t02.time_diff关联排序过滤最终完成session切分

SELECT
    *
FROM
    (
        SELECT
            t01.*,
            t02.event_time,
            time_diff,
            /* 取分等值连接后的第一条数据 */
            ROW_NUMBER() OVER(PARTITION BY t01.bid,t01.num ORDER BY t02.time_diff desc) AS num_2
        FROM
            log_data t01
        LEFT JOIN
        (
            SELECT
                bid,
                time_diff,
                event_time
            FROM
                (
                SELECT
                    t1.*,
                    t2.num,
                    /* 如果记录为首次或两个记录时间差大于30分钟则打上标记 */
                    CASE WHEN t2. event_time is NULL OR t1.event_time - t2.event_time > INTERVAL '30 minute' THEN t1.num ELSE null END AS time_diff
                FROM
                    log_data t1
                LEFT JOIN
                    /* 前后记录关联 */
                    log_data t2 on t1.bid = t2.bid AND t1.num = t2.num + 1
                )t02
            WHERE 
                t02.time_diff IS NOT NULL
        )t02 ON t01.bid = t02.bid AND t01.num >= t02.time_diff
    )tmp
/* 取num_2为1的记录 */
WHERE num_2 = 1
图五
图六

再添加session_id字段即可,本文采用md5(bid+event_time1)作为session_id

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容