美文网首页数据库
sql查询连续签到天数

sql查询连续签到天数

作者: 弦好想断 | 来源:发表于2021-04-12 22:48 被阅读0次

先建表

create table user_attendence(
user_id bigint comment '用户名', 
date TIMESTAMP comment '日期' ,
is_sign bigint comment '是否登录,0为否,1为是');
-- delete from user_attendence;

接下来用python自己导入随机数据,500个用户、时间2021-1-1~2021-5-5。

import pymysql
import pandas as pd
from sqlalchemy import create_engine
import numpy as np
df = pd.DataFrame()
date = pd.date_range('2021-1-1','2021-5-5').strftime('%Y-%m-%d')
df["user_id"]=[i for i in np.arange(1,500)]*len(date)
df['date'] = [i for i in date]*len(np.arange(1,500))
df["is_sign"] = [np.random.choice([0,1]) for i in range(len(df))]
df = df.sort_values(by=['user_id','date'],na_position='first')
#写入数据库
con = 'mysql+pymysql://root:3333@localhost:3306/supermanzwg?charset=utf8'
#如果出现字符串编码错误记得在Navicat运行alter table 表名 convert to character set utf8mb4;
df.to_sql(name='user_attendence',con=con,if_exists='append',index = False)

截至当前,每个用户已经连续签到的天数

查出最后一次不登录的日期,与当前日期进行比较,二者差值为几就是连续登录几天

select max(date) from user_attendence;
select 
user_id ,
max(date),
DATEDIFF('2021-02-19',max(date)) as max_con_days
from user_attendence 
where is_sign = 0 
group by user_id;

计算有史以来用户最大连续签到天数;

对用户分组,按日期进行排序,排序序号为rank;
如果日期与序号的差值为相等,按这个差值进行分组并计数,取最大值

select 
user_id
,max(次数)from 
    (select user_id
    ,date,rn
    ,a.date-a.rn diff
    ,count(*) 次数
    from 
        (select 
        user_id
        ,date,
        row_number() over(partition by user_id order by date asc) rn
        from user_attendence  
        where is_sign = 1
        ) a 
    group by user_id,diff
    ) b 
group by user_id;

相关文章

网友评论

    本文标题:sql查询连续签到天数

    本文链接:https://www.haomeiwen.com/subject/ztqokltx.html