SQL案例--游戲行業(yè)同時在線人數(shù)原來這么取...

我們先來看看下面的對話,早上上班開完早會的一個聊天:


對話

前情描述

為了方便理解,我們還是以游戲行業(yè)來講述這個案例。在游戲行業(yè)中,我們會記錄用戶每天第一次登錄的時間以及退出的時間,比如下面的表格式:
表一:

user_id login_time exit_time
206229224471933-l 2013/1/1 0:25 2013/1/1 0:27
237986483538894-l 2013/1/1 0:40 2013/1/1 0:42
307568672598035-l 2013/1/1 0:55 2013/1/1 0:56
... ... ...
237992837122033-l 2013/1/1 1:39 2013/1/1 23:58

表中有三個字段:user_id,login_time,exit_time。用戶id:user_id,每天進(jìn)入的時間:login_time,每天退出的時間:exit_time, 每個用戶每天一條記錄。

  • 現(xiàn)在為了方便廣告投放,我們想知道每天不同時點(diǎn)最大的在線人數(shù)

SQL

select 
    date(login_time) as login_date,
    hour(login_time) as login_hour,
    max(online_user_cnt) as online_user_cnt_max
from 
    (
    select 
        user_id,
        login_time,
        sum(index1) over(order by login_time asc ) as online_user_cnt
    from 
        (
        select 
            user_id,
            login_time,
            1 as index1
        from 
            login_data
        union all 
        select 
            user_id,
            exit_time,
            -1 as index1
        from 
            login_data
        )a 
    )b 
group by
    date(login_time) ,
    hour(login_time)

通過上面的SQL我們就得出了一段時間內(nèi)每天每個小時最大的在線人數(shù),結(jié)果如下:
表二:

然后可以在Excel中可以使用透視表看這段時間平均每天小時最大的在線量。也可以分不同的月份看每個月的最大量分布。(什么樣的行業(yè)會是在凌晨人多呢?)
結(jié)果:圖一

圖一

星星詳析

第一部分


select 
    user_id,
    login_time,
    1 as index1
from 
    login_data
union all 
select 
    user_id,
    exit_time,
    -1 as index1
from 
    login_data

把原始數(shù)據(jù)中的user_id和登錄時間(login_time)取出來,然后給一個index,每個用戶的登錄時都給一個1,然后union all 結(jié)束時間,給結(jié)束時間(exit_time)時一個-1,這樣我們就能在這個子查詢的外層以sum()和開窗函數(shù)(over)配合。

第二部分


select
    user_id,
    login_time,
    sum(index1) over(order by login_time asc ) as online_user_cnt
from 
    (
    select 
        user_id,
        login_time,
        1 as index1
    from 
        login_data
    union all 
    select 
        user_id,
        exit_time,
        -1 as index1
    from 
        login_data
    )a

利用開窗函數(shù)和sum()一起使用的特性,只要我們不在over中分組(partition by),那么sum的時候,就是從第一個行到當(dāng)前行的累加,并且以登錄時間升序,這樣,每次遇到登錄時間的時候就能加1,遇到退出時間就能減1了,如下:
表三

表三

這樣我們就得到每個時點(diǎn)的到秒級的當(dāng)前用戶量

第三部分


select 
    date(login_time) as login_date,
    hour(login_time) as login_hour,
    max(online_user_cnt) as online_user_cnt_max
from 
    (
    select 
        user_id,
        login_time,
        sum(index1) over(order by login_time asc ) as online_user_cnt
    from 
        (
        select 
            user_id,
            login_time,
            1 as index1
        from 
            login_data
        union all 
        select 
            user_id,
            exit_time,
            -1 as index1
        from 
            login_data
        )a 
    )b 
group by
    date(login_time) ,
    hour(login_time)

通過第二部分我們得到秒級的用戶登錄量,然后我們求出每小時最大的值,就是以天和小時進(jìn)行分組,然后取最大值就能得到我們每小時最大在線量了。
當(dāng)然我們也可以直接以天進(jìn)行分組,得到每天的最大量,因?yàn)槲覀円呀?jīng)求到了秒級的最大量了。

寫在最后

當(dāng)我們求出了每天每小時最大的量后,即表2,我在Excel可以看一段時間的平均每個小時最大量,如圖1,我也能對比看不同月份最大量的分布,有些特定行業(yè)在不同的月份可能表現(xiàn)不一樣,如下:
圖2

圖2

數(shù)據(jù)出來后就是大家自己處理了,目的不一樣,角度也不一樣了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 APP分析中經(jīng)常用到AARRR模型(海島模型)用來分析APP的現(xiàn)狀,其中一個重要節(jié)點(diǎn)就是提高留存(Acqui...
    amyhy閱讀 1,058評論 0 2
  • 在日常工作或者面試時,我們經(jīng)常會遇到這樣的問題,比如:“統(tǒng)計下用戶最長連續(xù)登錄的天數(shù)”,“統(tǒng)計下連續(xù)登錄超過10天...
    橘貓吃不胖閱讀 6,747評論 1 49
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,515評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,660評論 0 4

友情鏈接更多精彩內(nèi)容