天天看点

【SQL】运营数据计算(DAU、留存)

运营数据计算(DAU、留存)

      • 1 计算DAU日活
      • 2 计算留存率:次日留存

1 计算DAU日活

创建订单表

create table SC (id varchar(10),uid varchar(10),dt datetime(10));
insert into SC values ('01' , '466' , '2017-01-07 18:24:55');
insert into SC values ('02' , '458' , '2017-01-07 18:25:18');
insert into SC values ('03' , '458' , '2017-01-07 18:26:21');
insert into SC values ('04' , '592' , '2017-01-07 19:09:59');
insert into SC values ('05' , '393' , '2017-01-08 00:41:19');
insert into SC values ('06' , '592' , '2017-01-08 09:14:27');
insert into SC values ('07' , '592' , '2017-01-08 11:18:08');
insert into SC values ('08' , '636' , '2017-01-08 11:27:24');
insert into SC values ('09' , '458' , '2017-01-09 11:13:12');
insert into SC values ('10' , '458' , '2017-01-09 11:34:02');
insert into SC values ('11' , '413' , '2017-01-09 12:29:25');
insert into SC values ('12' , '413' , '2017-01-09 12:40:39');
insert into SC values ('13' , '393' , '2017-01-09 16:22:48');
insert into SC values ('14' , '592' , '2017-01-09 16:31:07');
insert into SC values ('15' , '592' , '2017-01-10 10:55:06');
insert into SC values ('16' , '458' , '2017-01-10 12:14:11');
insert into SC values ('17' , '458' , '2017-01-10 12:33:53');
insert into SC values ('18' , '462' , '2017-01-10 12:34:59');
insert into SC values ('19' , '413' , '2017-01-10 15:22:45');
insert into SC values ('20' , '466' , '2017-01-10 19:12:47');
           

Output:

id uid dt
01 466 2017-01-07 18:24:55
02 458 2017-01-07 18:25:18
03 458 2017-01-07 18:26:21
04 592 2017-01-07 19:09:59
05 393 2017-01-08 00:41:19
06 592 2017-01-08 09:14:27
07 592 2017-01-08 11:18:08
08 636 2017-01-08 11:27:24
09 458 2017-01-09 11:13:12
10 458 2017-01-09 11:34:02
11 413 2017-01-09 12:29:25
12 413 2017-01-09 12:40:39
13 393 2017-01-09 16:22:48
14 592 2017-01-09 16:31:07
15 592 2017-01-10 10:55:06
16 458 2017-01-10 12:14:11
17 458 2017-01-10 12:33:53
18 462 2017-01-10 12:34:59
19 413 2017-01-10 15:22:45
20 466 2017-01-10 19:12:47

计算DAU

原则:按日分组,统计每日不重复客户数量

select substr(dt, 1, 10) as dtt, 
    count(distinct uid ) as DAU 
    from SC 
    group by substr(dt, 1, 10); 
           

Output:

dtt DAU
2017-01-07 3
2017-01-08 3
2017-01-09 4
2017-01-10 5

2 计算留存率:次日留存

  • 用表合并的方式构造一阶滞后的new col,然后用new col除以old col得到比率

  • 通过构造一阶滞后的new column,巧妙地避免了循环

select substr(a.dt, 1,10) as ddt,
    count(distinct a.uid) as DAU,          --当日活跃用户数A
    count(distinct b.uid) as nextday_ret,  --次日留存用户数B
    (count(distinct b.uid) * 100 / count(distinct a.uid)) || '%' as one_day_ret  --次日留存率=B/A
    from SC a
    left join
    SC b
    on a.uid = b.uid and substr(b.dt,9,2)-substr(a.dt,9,2) = 1 --条件:滞后一天合并
    group by substr(a.dt, 1,10) ;
           

Output:

ddt DAU nextday_ret one_day_ret
2017-01-07 3 1 33%
2017-01-08 3 2 66%
2017-01-09 4 3 75%
2017-01-10 4 0%

注意1:最后一天的存留率无法知道

注意2:条件语句

可以替换为

参考

https://cloud.tencent.com/developer/article/1587655

sql