【051】row_number() over() 查询各个用户最长的连续登陆天数?

2024-05-26 23:58

本文主要是介绍【051】row_number() over() 查询各个用户最长的连续登陆天数?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


♣题目部分       查询各个用户最长的连续登陆天数?♣答案部分
row_number() over() 解说例一:      row_number() over() :简单的说row_number()从1开始,为每一条分组记录返回一个数字。例如首先在在线数据库中创建表,插入上图左边源表数据CREATE TABLE IF NOT EXISTS `loadrecord` (  `uid` int(6) unsigned NOT NULL,  `loadtime` varchar(200) NOT NULL,  PRIMARY KEY (`uid`,`loadtime`)) DEFAULT CHARSET=utf8;INSERT INTO `loadrecord` (`uid`, `loadtime`) VALUES  ('201', '2017/1/1'),  ('201', '2017/1/2'),  ('202', '2017/1/2'),  ('202', '2017/1/3'),  ('203', '2017/1/3'),  ('201', '2017/1/4'),  ('202', '2017/1/4'),  ('201', '2017/1/5'),  ('202', '2017/1/5'),  ('201', '2017/1/6'),  ('203', '2017/1/6'),  ('203', '2017/1/7');    其中,select uid,(row_number() over(partition by uid order by uid ) ) AS row_number_uid from loadrecord;返回为升序以后的每条uid记录返回一个序号:row_number() over()分组排序功能:在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、  order by 的执行。
例二:
create table TEST_ROW_NUMBER_OVER(       id varchar(10) not null,       name varchar(10) null,       age varchar(10) null,       salary int null);select * from TEST_ROW_NUMBER_OVER t; insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a',10,8000);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,'a2',11,6500);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b',12,13000);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,'b2',13,4500);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c',14,3000);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,'c2',15,20000);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,'d',16,30000);insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,'d2',17,1800);
对查询结果进行排序(无分组):
select id,name,age,salary,row_number()over(order by salary desc) rnfrom TEST_ROW_NUMBER_OVER t
根据id分组排序:
select id,name,age,salary,row_number()over(partition by id order by salary desc) `rank`from TEST_ROW_NUMBER_OVER t;
找出每一组中序号为一的数据?
select * from (select id,name,age,salary,row_number()over(partition by id order by salary desc) `rank`from TEST_ROW_NUMBER_OVER ) t where `rank` <2;
排序找出年龄在13岁到16岁数据,按salary排序:
select id,name,age,salary,row_number()over(order by salary desc)  `rank`from TEST_ROW_NUMBER_OVER t where age between '13' and '16';
#结果中 rank 的序号,其实就表明了 over(order by salary desc) 是在where age between and 后执行的
题目答案解析:
#第一步#判断连续的核心是row_number,因为row_number是连续的#所以day-row_number,如果值是恒定的,说明也是连续的,反之一定会变化#简单的说row_number()从1开始,为每一条分组记录返回一个数字,#这里的row_number() over(partition by uid uid 是先把uid列升序,#再为升序以后的每条uid记录返回一个序号。select uid,(day(loadtime) - row_number() over(partition by uid order by uid ) ) AS cnt from loadrecord;
#第二步#第一步得到的结果还不是很明显,需要分组用count()计数,取得不同连续值的次数SELECT uid,count(*) FROM(SELECT uid,(DAY(loadtime)-row_number() over(PARTITION BY uid ORDER BY uid) ) AS cnt FROM loadrecord) AS a GROUP BY uid,cnt;
#第三步#取得最大连续值#采用类似部门最高薪的方法 select max() group by SELECT uid, MAX(cnt) FROM(SELECT uid,count(*) AS cnt FROM(SELECT uid,(DAY(loadtime)-row_number() over(PARTITION BY uid ORDER BY uid) ) AS cnt FROM loadrecord) AS aGROUP BY uid,cnt) AS b GROUP BY uid;SELECT * from loadrecord WHERE row_number() over(partition by uid order by uid) ) AS cnt ;

About Me:小婷儿

● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:tinghai87605025 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果你觉得到文章对您有帮助,点击下方我的头像,赞赏我哦!

有您的支持,小婷儿一定会越来越好!

这篇关于【051】row_number() over() 查询各个用户最长的连续登陆天数?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1005955

相关文章

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

基于Redis实现附近商铺查询功能

《基于Redis实现附近商铺查询功能》:本文主要介绍基于Redis实现-附近商铺查询功能,这个功能将使用到Redis中的GEO这种数据结构来实现,需要的朋友可以参考下... 目录基于Redis实现-附近查询1.GEO相关命令2.使用GEO来实现以下功能3.使用Java实现简China编程单的附近商铺查询4.Red

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

MySQL 复合查询案例详解

《MySQL复合查询案例详解》:本文主要介绍MySQL复合查询案例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录基本查询回顾多表笛卡尔积子查询与where子查询多行子查询多列子查询子查询与from总结合并查询(不太重要)union基本查询回顾查询

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils