mysql查询每日新增用户量,结合python实现

之前在搜狐数据分析笔试的时候,同学拍下了这个问题

有两张表:

用户登录表A,字段信息为dt(登录日期),servertime(登录时间),userid(用户id),rolelevel(用户等级,int)

用户充值表B,字段信息为dt(充值日期),servertime(充值时间),userid(用户id),money(充值金额,int)

问题:

1 查询某个时间段,比如2018-9-3到2018-9-10期间,每天活跃的用户数

分析:每天每个用户可能登陆多次,需要去重

2 查询某个时间段每天的新增用户数,比如2018-9-3到2018-9-10期间,(假设2018-9-3号为某个游戏上线的第一天,登陆表是从2019-9-3开始有记录)

分析:2018-9-4新增即在2018-9-4之前从来未登陆过的用户,2018-9-5新增即在2018-9-5之前从来未登陆过的用户,

3 统计某个时间段的每一天,20级以上用户付费总金额

建表

create table denglu
(
dt date,
servertime datetime,
userid varchar(10),
rolelevel int
);
create table chongzhi
(
dt date,
servertime datetime,
userid varchar(10),
money int
);

插入些测试数据

insert into denglu
values
('2018-9-9','2018-09-09 12:31:30','0001',15),
('2018-9-9','2018-09-09 2:3:50','0001',15),
('2018-9-9','2018-09-09 12:31:40','0002',25),
('2018-9-9','2018-09-09 12:30:30','0003',19),
('2018-9-11','2018-09-11 1:41:34','0004',22),
('2018-9-10','2018-09-10 19:1:30','0005',25),
('2018-9-13','2018-09-13 10:21:30','0006',23),
('2018-9-15','2018-09-15 19:31:30','0001',15),
('2018-9-14','2018-09-14 17:36:30','0003',19),
('2018-9-14','2018-09-14 15:34:30','0007',20),
('2018-9-13','2018-09-13 12:21:30','0007',20);

insert into chongzhi
values
('2018-9-10','2018-09-10 19:12:30','0005',200),
('2018-9-9','2018-09-09 12:35:30','0001',50),
('2018-9-9','2018-09-09 12:33:30','0003',200),
('2018-9-11','2018-09-11 1:43:34','0004',100),
('2018-9-10','2018-09-10 19:12:30','0005',20),
('2018-9-13','2018-09-13 10:23:30','0006',80),
('2018-9-15','2018-09-15 19:34:30','0001',500);

问题1:在登录表中,按天数统计,即group by 日期,由于一天用户可能登录多次,即用distinct去重,语句如下:

select dt,count(distinct userid) as num from denglu where dt between '2018-09-09' and '2018-09-13' group by dt;

问题2:在本例中就相当于数据库中从9-9号才有数据,故9-9号新增的数据为9-10日之前登录的所有用户减去9-9号当天统计的用户数,9-11号新增的即9月10号之前所统计的用户数,以此类推

以9-9当天为例,先统计当天的用户,再统计9-10号之前(即9-9和9-10号两天)的用户,当后者不在前者之内,即是9-10号所增加的用户,把结果当成一个临时表,再计数得到9-10号所增加用户的数量

select count(*) from (select distinct userid from denglu where dt<='2018-9-10' and 
userid not in (select distinct userid from denglu where dt<='2018-9-9')) as tmp;

统计每天所增长的数量,可以把上面的时间给替换,写一个循环,最后用字典的键值对形式表示某天与其新增的数量,结合python代码实现:

import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='8008',db='demo',port=3306)
cursor = conn.cursor()

date_ = ['2018-9-9','2018-9-10','2018-9-11','2018-9-12','2018-9-13']

list_ = []
for i in range(len(date_)-1):
    cursor.execute("select count(*) from (select distinct userid from denglu where dt<='%s' and \
                userid not in (select distinct userid from denglu where dt<='%s')) as tmp;"%(date_[i+1],date_[i]))
    for j in cursor:
        list_.append(j[0])

date_.pop(0)
dict_ = dict(zip(date_,list_))
print(dict_)

得到测试数据的结果

问题3:涉及到两个表的字段,用外连接,统计每天用group by语句:

select B.dt,sum(B.money) 
from chongzhi as B left join denglu as A on B.userid = A.userid where A.rolelevel>=20
group by B.dt; 

测试数据结果:

以上都是自己所想,如有不对请指正

猜你喜欢

转载自blog.csdn.net/weixin_39631030/article/details/82726714
今日推荐