MySQL如何计算连续登录天数
作者:BurningSilence 发布时间:2024-01-17 18:05:00
标签:MySQL,计算,连续登录,天数
建表、insert数据
create table tmp_login (
user_id int(11) ,
login_date datetime
);
insert into tmp_login values(2,'2020-05-29 11:12:12');
insert into tmp_login values(2,'2020-05-29 15:12:12');
insert into tmp_login values(2,'2020-05-30 11:12:12');
insert into tmp_login values(2,'2020-05-31 11:12:12');
insert into tmp_login values(2,'2020-06-01 11:12:12');
insert into tmp_login values(2,'2020-06-02 11:12:12');
insert into tmp_login values(2,'2020-06-03 11:12:12');
insert into tmp_login values(2,'2020-06-04 11:12:12');
insert into tmp_login values(2,'2020-06-05 11:12:12');
insert into tmp_login values(2,'2020-06-06 11:12:12');
insert into tmp_login values(2,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-01 11:12:12');
insert into tmp_login values(7,'2020-06-02 11:12:12');
insert into tmp_login values(7,'2020-06-03 11:12:12');
insert into tmp_login values(7,'2020-06-05 11:12:12');
insert into tmp_login values(7,'2020-06-06 11:12:12');
insert into tmp_login values(7,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-08 11:12:12');
方法一 row_number()
1.查询所有用户的每日登录记录
select distinct user_id, date(login_date) as days
from tmp_login;
2.row_number()计算登录时间排序
select user_id, days, row_number() over(partition by user_id order by days) as rn
from (
select distinct user_id, date(login_date) as days from tmp_login) t1;
3.用登录时间 - row_number(),如果得到的日期相同,则认为是连续登录日期
select *, date_sub(days, interval rn day) as results
from(
select user_id, days, row_number() over(partition by user_id order by days) as rn
from (
select distinct user_id, date(login_date) as days from tmp_login) t1
) t2;
4. 按user_id、results分组就可得出连续登录天数
select user_id, count(*) as num_days
from (
select *, date_sub(days, interval rn day) as results
from(
select user_id, days, row_number() over(partition by user_id order by days) as rn
from (
select distinct user_id, date(login_date) as days from tmp_login) t1
) t2) t3
group by user_id , results;
直接用日期减去row_number(),不用date_sub的话,遇到登录日期跨月时会计算错误,
方法二lead() 或 lag()
这种情况适合的场景是,需要查找连续登录超过n天的用户,n为确定值
如果n为4,即计算连续登录超过4天的用户
-- lead计算连续登录
select distinct user_id
from(
select user_id, days, datediff(lead(days, 3, '1970-01-01') over(partition by user_id order by days), days)as results
from (
select distinct user_id, date(login_date) as days from tmp_login) t1) t2
where results = 3;
连续登录4天,则日期差应该为3。
来源:https://blog.csdn.net/BurningSilence/article/details/121558764
0
投稿
猜你喜欢
- 目录1、算数运算符:2、赋值运算符:3、比较运算符4、逻辑运算符5、 成员运算符总结大至分为以下5类运算符号算数运算符赋值运算符比
- 本文实例讲述了Python3中正则模块re.compile、re.match及re.search函数用法。分享给大家供大家参考,具体如下:r
- 高能预警本文包含演示部分,请读者自行copy代码编译体验。参考资料:sync.WaitGroup / signal.Notify / con
- 从这里开始我的博客,后台数据库是什么?没错,就是MySQL,服务器端使用的脚本就是PHP,整个框架使用的是WordPress。PHP和MyS
- python中docx库的简介python-docx包,这是一个很强大的包,可以用来创建docx文档,包含段落、分页符、表格、图片、标题、样
- 1. 原理2014年的一篇文章,开创cnn用到文本分类的先河。Convolutional Neural Networks for Sente
- 函数:split()Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串。通过指
- 问题描述字符串本身作为 bytess = '\xe4\xbd\xa0\xe5\xa5\xbd'解决方案s.encode(
- 传递函数创建传递函数有两种方式:import control as ctrl# 方式 1s = ctrl.tf('s')sy
- 自定义用户认证系统Django 自带的用户认证系统已经可以满足大部分的情况,但是有时候我们需要某些特定的需求。Django 支持使用其他认证
- 前言随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数
- 相信大家在日常学习或者是阅读英文文章的过程中,难免会出现几个不认识的单词,或者想快速翻译某段英文的意思。今天,利用Python爬虫等知识,教
- html代码:<!DOCTYPE html><html lang="en"><head&g
- 最近正在用功的学习jQuery,在琢磨了不少别人写的功能之后,也开始尝试着自己开发一些功能。今天我做了一个简单的密码强度测试工具。这可功能的
- 在MySQL的管理过程中,会遇到PC Server脱机或者重启,我需要在主机启动后再将MySQL服务启动。如果上百台或者更多的MySQL主机
- 创建时间序列函数pd.date_range()根据指定的范围,生成时间序列DatetimeIndex,每隔元素的类型为Timestamp。该
- python:如何将excel文件转化成CSV格式import pandas as pddata = pd.read_excel('
- 一、什么是数据驱动测试DDT:data drive test准备一组数据,通过写一个测试用例,不同的数据进行迭代。二、csv文件承载数据CS
- 本篇内容通过GitHub仓库创建过程以及创建连接后的上传与下载,详细介绍了Git版本控制器使用情况,来看下。首先介绍一下什么是Git:git
- pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数