1. 人数分布情况
统计某段时间内活跃用户按天数统计的人数分布情况,分布没有方向,按月内最多天数统计分布
主要步骤:先按人对天数去重计数,然后再按天数对去重的人数计数,最后,按天数大小汇总统计
SELECT
SUM(IF(diffcdate=1,dd,0)) '[1,2)',
SUM(IF(diffcdate=2,dd,0)) '[2,3)',
SUM(IF(diffcdate=3,dd,0)) '[3,4)',
SUM(IF(diffcdate=4,dd,0)) '[4,5)',
SUM(IF(diffcdate=5,dd,0)) '[5,6)',
SUM(IF(diffcdate=6,dd,0)) '[6,7)',
SUM(IF(diffcdate=7,dd,0)) '[7,8)',
SUM(IF(diffcdate=8,dd,0)) '[8,9)',
SUM(IF(diffcdate=9,dd,0)) '[9,10)',
SUM(IF(diffcdate>9,dd,0)) '[10,hi)',
SUM(dd) 'TOTAL'
FROM (
SELECT
diffcdate,COUNT(*) dd
FROM(
SELECT
uid, COUNT(DISTINCT date(createtime)) diffcdate
FROM
coin_record
GROUP BY uid
) m1
GROUP BY diffcdate
) m2
结果如下:
2. 累计人数分布情况
统计某段时间内活跃用户天数的累计人数分布情况,向天数少的方向累计的,本例主要用参数加循环的办法实现
SET @d=1; -- 某人活跃的第几天,默认是第一天
SET @uid=0; -- 当前统计人员uid
SET @change=99; -- uid参数,不是0就是新的uid
SELECT
SUM(IF(dd=1,1,0)) '[1,2)',
SUM(IF(dd=2,1,0)) '[2,3)',
SUM(IF(dd=3,1,0)) '[3,4)',
SUM(IF(dd=4,1,0)) '[4,5)',
SUM(IF(dd=5,1,0)) '[5,6)',
SUM(IF(dd=6,1,0)) '[6,7)',
SUM(IF(dd=7,1,0)) '[7,8)',
SUM(IF(dd=8,1,0)) '[8,9)',
SUM(IF(dd=9,1,0)) '[9,10)',
SUM(IF(dd>9,1,0)) '[10,hi)',
COUNT(DISTINCT uid) 'TOTAL'
FROM (
SELECT
@change:=if(@uid!=uid,@uid:=uid ,0) changetouid , -- 是否换人了,0未换人,否则@uid变成新的uid
IF(@change=0,@d:=@d+1,@d:=1) dd , -- @change=0是没有换人,uid用户的活跃的天数要加1
u1.uid,u1.cdate,u1.coin
FROM (
SELECT
uid, date(createtime) cdate,sum(coin) coin
FROM
coin_record
GROUP BY uid, date(createtime)
# ORDER BY uid, date(createtime)
) u1
) m;
1)按人、天数汇总统计
2)对上述结果进行循环,对每一条记录判断是否换人了,未换人changetouid为0,dd为每人在本月活跃的第几个天数,存在一个新的天数即加1,若换人了changetouid为新的uid
3)最后对上述结果进行汇总,按dd的不同天数汇总,本例只统计某个月的10段范围的统计数,即,处在1天、2天、……到10+天的活跃人数分布,结果如下: