• mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&...
mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/mysql计算连续天数，mysql连续登录天数，连续天数统计：http://fanshuyao.iteye.com/blog/2341455Oracle计算连续天数，计算连续时间，Oracle连续天数统计http://fanshuyao.iteye.com/blog/2341163一、表结构及初始化数据DROP TABLE user_login;CREATE TABLE user_login(pid INT NOT NULL,login_time DATETIME NOT NULL);INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-23 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-10 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-09 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-23 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-22 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-21 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-20 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-19 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-02 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-30 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-29 09:30:45');二、封装计算连续天数的方法DELIMITER $$CREATEFUNCTION f_continuty_days(id INT, start_time DATE, end_time DATE)RETURNS INTBEGINDECLARE days INT;DECLARE flag INT;DECLARE previous_day DATE;SET days := 0;SET flag := 1;SET previous_day := DATE_SUB(end_time,INTERVAL 1 DAY);WHILE flag>0 DOSELECT COUNT(DISTINCT(DATE(login_time))) INTO flag FROM user_loginWHERE pid = idAND DATE(login_time) = previous_day ;IF flag > 0 THENSET days := days + 1;SET previous_day := DATE_SUB(previous_day,INTERVAL 1 DAY);END IF;END WHILE;RETURN days;END$$DELIMITER ;三、调用方法把用户pid、开始时间、结束时间参数传进去。SELECT f_continuty_days(1,DATE('2016-10-01'),DATE('2016-11-25'));>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/
展开全文
• ## 连续登录天数计算

万次阅读 热门讨论 2019-09-24 13:44:32
最近有个需求，计算用户连续登录的最大天数，查了查网上的解决方案，基本上都没有解决跨月和跨年的情况；废话不多少，先看下登录日志数据表hive.traffic.access_user只有两个字段：uid，day;日期辅助表hive.ods.dim_...
最近有个需求，计算用户连续登录的最大天数(这里使用prestoSql，使用hive也可以)，先看下登录日志数据表hive.traffic.access_user只有两个字段：uid，day;日期辅助表hive.ods.dim_date,这个表只有一个字段day；
先说下思路，

uid
day
rownumber
day-rownumber【days】

101
20190911
1
20190911-1=20190910

101
20190912
2
20190912-2=20190910

101
20190913
3
20190913-3=20190910

101
20190916
4
20190916-4=20190912

101
20190917
5
20190917-5=20190912

从上可以看到，只要是连续登录的话，day-rownumber的差值是一样的，那问题来了，这样的减法在跨月或者跨年的时候会出问题，所以我们首先将日期转换成有序的数字
select day,ROW_NUMBER() OVER(ORDER BY day) daynum from hive.ods.dim_date


接下来，我们需要将用户登录日志按照uid分组，然后按照日期排序，然后计算出rownumber
with a as (select uid,day from hive.traffic.access_user where day>=20190801 and uid<>'')
select uid,day,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY uid,day) rownum from a group by day,uid


接下来就是计算差值，差值相同的代表连续登录日期，完整sql如下
with a as (select uid,day from hive.traffic.access_user where day>=20190801 and uid<>''),
b as (select uid,day,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY uid,day) rownum from a group by day,uid ),
c as(select day,ROW_NUMBER() OVER(ORDER BY day) daynum from hive.ods.dim_date),
d as (select uid,b.day,daynum,rownum,daynum-rownum days from b join c on b.day=c.day )
select uid,min(day)"连续登录开始日",count(*) "连续登录天数" from d group by uid,days


end


展开全文
• mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&...
mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/mysql计算连续天数，mysql连续登录天数，连续天数统计：http://fanshuyao.iteye.com/blog/2341455Oracle计算连续天数，计算连续时间，Oracle连续天数统计http://fanshuyao.iteye.com/blog/2341163一、表结构及初始化数据DROP TABLE user_login;CREATE TABLE user_login(pid INT NOT NULL,login_time DATETIME NOT NULL);INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-23 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-10 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-09 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-23 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-22 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-21 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-20 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-19 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-02 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-30 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-29 09:30:45');二、封装计算连续天数的方法DELIMITER $$CREATEFUNCTION f_continuty_days(id INT, start_time DATE, end_time DATE)RETURNS INTBEGINDECLARE days INT;DECLARE flag INT;DECLARE previous_day DATE;SET days := 0;SET flag := 1;SET previous_day := DATE_SUB(end_time,INTERVAL 1 DAY);WHILE flag>0 DOSELECT COUNT(DISTINCT(DATE(login_time))) INTO flag FROM user_loginWHERE pid = idAND DATE(login_time) = previous_day ;IF flag > 0 THENSET days := days + 1;SET previous_day := DATE_SUB(previous_day,INTERVAL 1 DAY);END IF;END WHILE;RETURN days;END$$DELIMITER ;三、调用方法把用户pid、开始时间、结束时间参数传进去。SELECT f_continuty_days(1,DATE('2016-10-01'),DATE('2016-11-25'));>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/
展开全文
• mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&...
mysql计算连续天数，mysql连续登录天数，连续天数统计>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/mysql计算连续天数，mysql连续登录天数，连续天数统计：http://fanshuyao.iteye.com/blog/2341455Oracle计算连续天数，计算连续时间，Oracle连续天数统计http://fanshuyao.iteye.com/blog/2341163一、表结构及初始化数据DROP TABLE user_login;CREATE TABLE user_login(pid INT NOT NULL,login_time DATETIME NOT NULL);INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-24 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-23 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-10 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-09 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(1,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-25 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-24 13:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-23 10:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-22 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-21 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-20 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-19 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-02 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-11-01 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-31 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-30 09:30:45');INSERT INTO user_login(pid, login_time) VALUES(2,'2016-10-29 09:30:45');二、封装计算连续天数的方法DELIMITER $$CREATEFUNCTION f_continuty_days(id INT, start_time DATE, end_time DATE)RETURNS INTBEGINDECLARE days INT;DECLARE flag INT;DECLARE previous_day DATE;SET days := 0;SET flag := 1;SET previous_day := DATE_SUB(end_time,INTERVAL 1 DAY);WHILE flag>0 DOSELECT COUNT(DISTINCT(DATE(login_time))) INTO flag FROM user_loginWHERE pid = idAND DATE(login_time) = previous_day ;IF flag > 0 THENSET days := days + 1;SET previous_day := DATE_SUB(previous_day,INTERVAL 1 DAY);END IF;END WHILE;RETURN days;END$$DELIMITER ;三、调用方法把用户pid、开始时间、结束时间参数传进去。SELECT f_continuty_days(1,DATE('2016-10-01'),DATE('2016-11-25'));>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>蕃薯耀 2016年11月28日 09:29:10 星期一http://fanshuyao.iteye.com/
展开全文
• SQL——连续最大登录天数问题
• t;&gt;&...mysql计算连续天数，mysql连续登录天数，连续天数统计： http://fanshuyao.iteye.com/blog/2341455   Oracle计算连续天数，计算连续时间，Oracle连续天数统计 http://fanshuya
• Hive SQL——最大连续登录天数、当前连续登录天数、最大连续未登录天数问题 1、数据准备 表字段：用户、新增日期、活跃日期 原数据表：user_active表 1.1、测试数据：比较date和timestamp类型 CREATE TABLE ...
• 在现在的很多网站中都有这样一个功能。记录用户的连续登陆天数，所谓的连续在线是指相邻两天都登录过...这篇文章主要介绍的是利用sql语句如何查询在两个日期之间最大的连续登录天数，有需要的朋友们下面来一起看看吧。
• 在网上看到一道有意思的题目，大意是如何在mysql查询连续的时间内登录的次数。原文链接：首先建表，填充测试数据：CREATE TABLE tmysql_test_lianxu_3 (id int(11) NOT NULL AUTO_INCREMENT,uid int(11) ...
• 查询连续登录天数1.问题描述2.在Hive中建表3.查询最大连续登录天数 1.问题描述 目前有两列数据，分别是用户ID和用户登录的时间，现需要统计用户连续登录的最大天数，中间如有断开，则不算连续，如下图示例。 2.在...
• 1、当个用户当前连续登录天数查询 SELECT GETINTO_USERID, max(days) incessancy_days, min(ot) start_date, max(ot) end_date FROM ( SELECT * FROM ( SELECT GETINTO_USERID ,@cont_day := ( CASE WHEN ( @last_...
• 连续登录天数的SQL查询 数据库版本:MySQL 8.0.16 建表以及插入数据 CREATE TABLE tmp_last_3_days ( user_id int(11) , login_date date ) COMMENT='连续登录表' ; insert into tmp_last_3_days values(123,'...
• 当月最长连续发文天数: //临时：id_time_table: select distinct app_id, from_unixtime(create_date_time, 'yyyy-MM-dd') fawen_date from bjh_ods_task_manage_df where event_day='\$baseDay' and object_...
• mysql如何查询两个日期之间最大的连续登录天数前言最近工作中遇到一个需求，是根据用户连续记录天数来计算的，求出用户在一段时间内最大的连续记录时间，例如在2016-01-01 和2016-01-28 之间，如果用户在3号和4号都...
• 我们在工作中或者面试时，可能会遇到求出用户连续登录天数、连续签到天数等问题，这篇文章就是用窗口函数比较巧妙的解决这个问题的。文章比较长，建议先收藏后观看+_+数据准备和处理：如下代码是创建用户登录表，...
• 我们在工作中或者面试时，可能会遇到求出用户连续登录天数、连续签到天数等问题，这篇文章就是用窗口函数比较巧妙的解决这个问题的。文章比较长，建议先收藏后观看+_+首先是数据准备和处理如下代码是创建用户登录表...
• --用户登录信息表CREATE TABLE user_log (user_id varchar(10) NOT NULL,log_in_date date NOT NULL,PRIMARY KEY (user_id,log_in_date) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf...

...