[APP大數據項目]第五天筆記

查詢某個app當前周天天新增用戶數
SELECT formattime(t.mintime,'yyyy/MM/dd') stdate, count(*) stcount
FROM
(
SELECT deviceid, min(createdatms) mintime
FROM ext_startup_logs
GROUP BY deviceid
HAVING mintime>=getweekbegin() AND mintime < getweekbegin(1)
) t
GROUP BY  formattime(t.mintime,'yyyy/MM/dd')

用戶分析

務必利用分區以免全局掃描!app

過去五週某個app的周活躍用戶數
SELECT formattime(createdatms, 'yyyyMMdd', 0), count(distinct deviceid) stcount 
FROM ext_startup_logs
WHERE concat(ym,day)>= formattime(getweekbegin(-4),'yyyyMM') AND appid='sdk34734'
GROUP BY formattime(createdatms, 'yyyyMMdd', 0)

解釋:函數

concat() 自帶的字符串拼接函數
formattime(string,string,int) 得到某個時間當前周的第一天
  1. formattime(getweekbegin(-4),'yyyyMM') 得到四周前的第一天的年月,經過和ym+day比較 限定分區
  2. 根據每週第一天分區,count 計算分區內的數量
最近六個月的月活
SELECT formattime(createdatms, 'yyyyMM'), count(distinct deviceid) stcount 
FROM ext_startup_logs
WHERE ym>= formattime(getmonthbegin(-5),'yyyyMM') AND appid='sdk34734'
GROUP BY formattime(createdatms, 'yyyyMM')
沉默用戶

用戶僅在安裝當天啓動一次,後續通過一段時間內時間內都無啓動行爲
反映新增用戶質量和app匹配程度
這裏咱們按下載後大於兩天沒再啓動code

SELECT COUNT(*)
FROM
(
SELECT deviceid, count(createdatms) dcount,min(createdatms) dmin
FROM ext_startup_logs
WHERE appid='sdk37434' 
AND dmin<getdaybegin(-1) 
AND dcount = 1 
) t;
版本分佈

不一樣版本的用戶分析
如 某app 不一樣版本的活躍用戶數orm

當天某app 不一樣版本的活躍用戶數
SELECT appversion, count(*)
FROM ext_startup_logs
WHERE appid = 'sdk34734'
AND ym = fomattime(getdaybegin(),'yyyyMM') 
AND day = formattime(getdaybegin(),'dd')
GROUP BY appversion
當前周天天的日活
SELECT formattime(createdatms, 'yyyyMMdd'), appversion, count(distinct deviceid)
FROM ext_startup_logs
WHERE concat(ym,day)>=formattime(getweekbegin(),'yyyyMMdd')
AND appid = 'sdk34734'
GROUP BY formattime(createdatms, 'yyyyMMdd') , version

用戶構成分析

本週迴流用戶

上週未啓動過應用,本週啓動了應用的用戶字符串

SELECT distinct deviceid
FROM ext_startup_logs
WHERE appid='#' 
AND concat(ym,day) >= formattime(getweekbegin(),'yyyyMMdd')
AND deviceid NOT IN (
    SELECT distinct b.deviceid
    FROM ext_startup_logs b
    WHERE b.appid = '#'
    AND concat(b.ym,b.day) >= formattime(getweekbegin(-1),'yyyyMMdd')
    AND concat(b.ym,b.day) < formattime(getweekbegin(),'yyyyMMdd')
);

解釋:
分別查出上週啓動過的用戶和本週啓動過的用戶,經過NOT IN 集合做差取到上週未啓動,本週啓動的用戶
注意,子嵌套查詢 須要加表別名,不然沒法分辨列名到底屬於哪個表get

連續活躍n周的用戶

假如爲3周string

SELECT deviceid, count(distinct(formattime(getweekbegin(createdatms),'yyyyMMdd'))) c
FROM ext_startup_logs
WHERE appid = '#'
AND concat(ym,day)>=fomattime(getweekbegin(-2),'yyyyMMdd')
GROUP BY deviceid
HAVING c = 3

解釋:
先按照deviceid分組,再把時間轉爲周起始時間,統計每一個組裏不一樣的周起始時間有幾個io

留存用戶

對於一段時間內新增的用戶,通過一段時間後仍在使用應用的用戶
好比 周留存用戶: 上上一週新增的用戶 在上一週仍有啓動應用的操做form

SELECT distinct(deviceid)
FROM ext_startup_logs
WHERE appid='#'
AND concat(ym,day)>=formattime(getweekbegin(-1),'yyyyMMdd')
AND concat(ym,day)<formattime(getweekbegin(),'yyyyMMdd')
AND NOT IN (
    SELECT t.deviceid
    FROM
    (
        SELECT min(b.createdatms) mintime,b.deviceid
        FROM ext_startup_logs b
        WHERE b.appid='#'
        GROUP BY b.deviceid
        HAVING mintime>=getweekbegin(-2)
        AND mintime<getweekbegin(-1)
    )t
)

解釋:
拿出上週啓動過的用戶,而後再和上上週的新增用戶比較,交集即爲留存用戶date

新鮮度

某段時間的新增用戶數 / 某段時間活躍的老用戶
好比某日的新鮮度

m = 
SELECT count(*) FROM(
SELECT min(createdatms) mintime,deviceid
FROM ext_startup_logs
WHERE appid = '#'
GROUP BY deviceid
HAVING mintime>getdaybegin()
)t;
n = 
SELECT count(distinct deviceid)
FROM ext_startup_logs
WHERE appid='#'
AND concat(ym,day) = formattime(getdaybegin(),'yyyyMMdd')

n/(m-n)

相關文章
相關標籤/搜索