MySQL如何计算连续登录天数

目录
  • 方法一 row_number()
  • 方法二lead() 或 lag()

建表、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 rnfrom (	select distinct user_id, date(login_date) as days from tmp_login) t1;

3.用登录时间 - row_number(),如果得到的日期相同,则认为是连续登录日期

select *, date_sub(days, interval rn day) as  resultsfrom(	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_daysfrom (	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) t3group 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) t2where results = 3;

连续登录4天,则日期差应该为3。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SQL查询至少连续n天登录的用户

    以连续3天为例,使用工具:MySQL. 1.创建SQL表: create table if not exists orde(id varchar(10),date datetime,orders varchar(10)); insert into orde values('1' , '2019/1/1',10 ); insert into orde values('1' , '2019/1/2',109 ); insert into orde values('1' , '2019/1/3',15

  • mysql如何查询两个日期之间最大的连续登录天数

    前言 最近工作中遇到一个需求,是根据用户连续记录天数来计算的,求出用户在一段时间内最大的连续记录时间,例如在 2016-01-01 和 2016-01-28 之间,如果用户在3号和4号都记录了,那么连续记录天数为2,如果用户在6号-10号每日都记录了,那么最大连续记录天数为5. 拿到这个需求的时候,说实话有点懵,第一想到的就是在代码中去统计,会用到循环,想到那么多个用户,并且时间跨度也有点大,比如15年到16年,两年时间,想想就有点恐怖. 解决方案 然后就把这个需求跟朋友说了,朋友也觉得有点难搞

  • mysql 生成连续日期及变量赋值

    目录 1.生产连续日期 2.变量赋值 1.生产连续日期 说明:主要作用于一些统计数据,来根据时间顺序进行显示:假如数据库数据有隔天数据,偏偏统计又需要每天的都显示,即便是0,那就要生成一个时间表,来使用: 查询数据库数据: SELECT         DATE_FORMAT( create_time, '%Y-%m-%d' ) AS date,         COUNT(1) AS numb FROM     qc_task      WHERE     create_time>= DATE

  • MySQL计算两个日期相差的天数、月数、年数

    MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等. SELECT TIMESTAMPDIFF(类型,开始时间,结束时间) 相差的秒数: SELECT TIMESTAMPDIFF(SECOND,'1993-03-23 00:00:00',DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')) 相差的分钟数: SELECT TIMESTAMPDIFF(MINUTE,'

  • MySQL如何计算连续登录天数

    目录 方法一 row_number() 方法二lead() 或 lag() 建表.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

  • SQL 查询连续登录的用户情况

    以连续3天为例,使用工具:MySQL. 1.创建SQL表: create table if not exists orde(id varchar(10),date datetime,orders varchar(10)); insert into orde values('1' , '2019/1/1',10 ); insert into orde values('1' , '2019/1/2',109 ); insert into orde values('1' , '2019/1/3',15

  • MYSQL实现连续签到功能断签一天从头开始(sql语句)

    1,创建测试表 CREATE TABLE `testsign` ( `userid` int(5) DEFAULT NULL, `username` varchar(20) DEFAULT NULL, `signtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `type` int(1) DEFAULT '0' COMMENT '为0表示签到数据,1表示签到日期字典数据' ) ENGIN

  • js获取一组日期中最近连续的天数

    用js获取一组日期(并把当天算入)中连续的天数,具体内容如下 首先得有一组日期,比如: var arr = [ '2016/02/28', '2016/02/29', '2017/02/26', '2017/02/27', '2017/02/28' ]; //日期格式需要注意,因为考虑到要判断日期的连续性,会把该数组中元素转为时间戳; 然后要加入当前日期,获取: var date = new Date(); var y = date.getFullYear(); var m = date.get

  • php+mysql实现简单登录注册修改密码网页

    对于php和mysql的连接在许多blog上都有说明,为了将mysql中的查询,修改,插入等操作掌握,本文介绍了一下如何采用mysql做一个登录注册修改密码的网页. 其中,如下 1.登录-即为对数据库中的内容给予查询,并验证html中的信息与数据库是否匹配: 2.注册-即为对数据库中的内容进行插入,注册帐号与密码: 3.修改密码-即为对数据库中的内容进行修改. 这三个操作,我用了8个php和html文本来建立 具体见代码部分 1.登录的主界面index.html: <p> </p>

  • ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解

    正好最近的域名备案通过了,兴起就突然想做一个网页,虽然之前去备案域名也是有这个目的. 问过几个人,说用linux上用PHP搭建网站很简单,就试着做了一个,这里主要说一下登录验证相关的部分: 首相准备几个文件,主要是index.php.conn.php.data.php以及login.php; login.php 主要是登录过程中的数据对比部分:其中include ('conn.php')内容在下面有说. <?php if(!isset($_POST['submit'])){ exit('logi

  • php+mysql大量用户登录解决方案分析

    本文实例分析了php+mysql大量用户登录解决方案.分享给大家供大家参考.具体分析如下: 百度.QQ.360等大公司都拥有上亿的用户量,不仅所有子网站都通过一个账号登录,而且还开放用户平台,提供给其他网站使用,这种级别的数据量和访问量,如果不做优化,估计很快就会宕机,这些公司都是一个专门的团队,维护一个注册登录,细节设计的非常优秀,现在粗略谈下他们的设计方案. 大数据的时候,压力不在PHP,主要在MySQL,PHP可以做负载均衡,10台机器抗不住就用20台或者100台,这都不是瓶颈. 但是My

  • Linux平台mysql开启远程登录

    开发过程中经常遇到远程访问mysql的问题,每次都需要搜索,感觉太麻烦,这里记录下,也方便我以后查阅. 首先访问本机的mysql(用ssh登录终端,输入如下命令): mysql -uroot -p 输入密码登陆进去后,输入如下的语句: use mysql; grant all privileges on *.* to 'user'@'%' identified by 'password' with grant option; 其中: user是用户名 mysql默认的是root password

  • Oracle用户连续登录失败次数限制如何取消

    当用户连续登录失败次数过多时,Oracle会锁定该用户,"FAILED_LOGIN_ATTEMPTS"用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以按照以下方法操作: 1. 输入以下命令,查看"FAILED_LOGIN_ATTEMPTS"的值: SQL> select * from dba_profiles s where s.profile='DEFAULT' and resource_name='FAILED_LOGIN_A

随机推荐