對用戶行為記錄進行物理切分session

背景

需要對用戶的訪問日志記錄進行轉(zhuǎn)化分析葫笼,由于日志記錄沒有業(yè)務session,需要物理地對訪問記錄進行session切分奕谭,規(guī)則是30分鐘內(nèi)的用戶操作為一個會話(session)撵幽,如果兩個操作之間的時間間隔超過30分鐘斯稳,則判定為兩個session。
環(huán)境:GreenPlum(postgresql)

數(shù)據(jù)

/*
用戶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訪問的記錄

圖二

問題轉(zhuǎn)化為尋找每個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
    /* 前后記錄關(guān)聯(lián) */
    log_data t2 on t1.bid = t2.bid AND t1.num = t2.num + 1

根據(jù)t1.bid = t2.bid AND t1.num = t2.num + 1關(guān)聯(lián)得到切分點的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
        /* 前后記錄關(guān)聯(lián) */
        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關(guān)聯(lián)排序過濾最終完成session切分

SELECT
    *
FROM
    (
        SELECT
            t01.*,
            t02.event_time,
            time_diff,
            /* 取分等值連接后的第一條數(shù)據(jù) */
            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
                    /* 前后記錄關(guān)聯(lián) */
                    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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忍捡,隨后出現(xiàn)的幾起案子集漾,更是在濱河造成了極大的恐慌,老刑警劉巖砸脊,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件具篇,死亡現(xiàn)場離奇詭異,居然都是意外死亡凌埂,警方通過查閱死者的電腦和手機驱显,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞳抓,“玉大人埃疫,你說我怎么就攤上這事『⒀疲” “怎么了栓霜?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臭笆。 經(jīng)常有香客問我叙淌,道長,這世上最難降的妖魔是什么愁铺? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任鹰霍,我火速辦了婚禮,結(jié)果婚禮上茵乱,老公的妹妹穿的比我還像新娘茂洒。我一直安慰自己,他們只是感情好瓶竭,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布督勺。 她就那樣靜靜地躺著渠羞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪智哀。 梳的紋絲不亂的頭發(fā)上次询,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音瓷叫,去河邊找鬼屯吊。 笑死,一個胖子當著我的面吹牛摹菠,可吹牛的內(nèi)容都是我干的盒卸。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼次氨,長吁一口氣:“原來是場噩夢啊……” “哼蔽介!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煮寡,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤虹蓄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幸撕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體武花,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年杈帐,在試婚紗的時候發(fā)現(xiàn)自己被綠了体箕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑童,死狀恐怖累铅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情站叼,我是刑警寧澤娃兽,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站尽楔,受9級特大地震影響投储,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阔馋,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一玛荞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呕寝,春花似錦勋眯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塞蹭。三九已至,卻和暖如春讶坯,著一層夾襖步出監(jiān)牢的瞬間番电,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工辆琅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钧舌,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓涎跨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崭歧。 傳聞我的和親對象是個殘疾皇子隅很,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容