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
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) 得到某個時間當前周的第一天
formattime(getweekbegin(-4),'yyyyMM')
得到四周前的第一天的年月,經過和ym+day比較 限定分區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
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
假如爲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)