ROW_NUMBER 和OVER()分组
GroupBy的介绍
在我们使用SQL进行查询的时候经常会用到GroupBy进行分组查询操作
分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
当对一个列进行分组,因为只会显示该列的一条不重复数据,对于其他列依然是存在多条。
Mysql的严格模式
Mysql处于严格模式(SQL_MODE被设置为 ONLY_FULL_GROUP_BY
)
如果SQL写成select * from t group by name
,就会报错,原因就是因为除了name之前,其他列的数据都不是唯一的,在严格模式会报错。
解决方法
ANY_VALUE()
不过,在严格模式(ONLY_FULL_GROUP_BY
)下,依然是想获取聚合列:
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
原理就是从分组中,随意获取一个数据,前提也就是你不关心组数据中的不同情况。
主键分组
方法二:如果GROUP BY
是主键或者 unique NOT NULL
时是可以查询非聚合的列的,原因是此时分组的key
是主键,则每一个分组只有一条数据,因此是可以进行查询非聚合的列的。
关闭严格模式
方法三:关闭严格模式
查看当前sql_model
:
查看当前sql_model
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
OVER()
OVER()
- over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
- over(partition by deptno)按照部门分区
- over(partition by deptno order by salary)分组加排序
前置函数演示
用于配合OVER()使用,存在多个可以去使用
OVER()是可以单独使用,包括这些前置函数都是可以的
ROW_NUMBER()
将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号
select * from(select name,class,s,row_number()over(partition by class order by s desc) mm from t2) where mm=1;
查询结果
因为ROW_NUMBER()会对每一个查询到的数据都给给与个数字标识,我们查询的是给与数字标识为1的
RANK_NUMBER()
select * from(select name,class,s,rank()over(partition by class order by s desc) mm from t2) where mm=1;
查询结果
对每一个查询到的数据都给给与个数字标识,对于排序相同的会给出相同的,数字标识
select name,class,s,rank()over(partition by class order by s desc) mm from t2
查询结果
rank()和dense_rank()可以将所有的都查找出来:
如上可以看到采用rank可以将并列第一名的都查找出来;
rank()和dense_rank()区别:
rank()是跳跃排序,有两个第二名时接下来就是第四名;
DENSE_RANK()
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
下面还存在很多类似的函数,感兴趣可以了解。我看不下去了卷不动了
ROW_NUMBER 和OVER()分组相关推荐
- 巧用row_number和partition by分组取top数据
2019独角兽企业重金招聘Python工程师标准>>> 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 20 ...
- [转]SQL2005后的ROW_NUMBER()函数的应用
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
- 窗口分析函数_7_生成指定的分组序号
生成指定的分组序号 需求描述 需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序后分为4组. 解决方法:通过ntile OVER()来完成. 注: 数据库数据集SQL脚本详见如下链接地址 ...
- ROW_NUMBER、RANK()、DENSE_RANK()和OVER的使用
/*以FoodPrice列排序并显示排序后的行号*/ SELECT ROW_NUMBER() OVER(ORDER BY FoodPrice DESC) AS RowId,* FROM dbo.Foo ...
- MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER
文章目录 1. 排名分类 1.1 区别RANK,DENSE_RANK和ROW_NUMBER 1.2 分组排名 2. 准备数据 3. 不分组排名 3.1 连续排名 3.2 并列跳跃排名 3.3 并列连续 ...
- Spark SQL 开窗函数row_number的使用
Spark SQL 开窗函数row_number的使用 窗口函数 row_number即为分组取topN 参考文本: 型号 ...
- 如何去重一个Oracle表
如何去重一个oracle表, 这是数据仓库中经常要碰到的问题, 多数ETL工具都提供这样的功能, 如果要求用一条SQL, 该如何写呢? 如果是完全重复的记录,即所有字段均重复的记录, 去重很简单, d ...
- SQL取出每个产品的Top n 条记录
1.创建表结构和数据 创建表和数据 Create Table Product --产品表 ( ProductID Int Identity(1,1) Primary key, --产品ID Produ ...
- hive substr函数_数据分析工具篇——HQL函数及逻辑
本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢? 时间函数 1)时间 ...
最新文章
- 零起点学算法02——输出简单的句子
- linux学 java_[操作系统]Linux学习第二步(Java环境安装)
- python在财务中的应用实训报告-实践应用|PyQt5制作雪球网股票数据爬虫工具
- 设计模式的征途—21.迭代器(Iterator)模式
- 程序猿的节日:1024,今天祝愿全球所有程序猿们、IT精英们节日快乐!——我在上海写代码
- 如何为云原生应用带来稳定高效的部署能力?
- 计算机硬件系统设计mooc,计算机硬件系统设计MOOC答案
- [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类
- 如何创建URL Mashup并插入到SAP Cloud for Customer标准页面里
- linux qt 添加动态链接库_Qt 连接MySql数据库
- linux 文件格式压缩
- keil 在多字节的目标代码页中 没有此unicode_Go语言之父带你重新认识字符串、字节、rune和字符
- Google Play市场考察报告-2
- 按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历
- MySQL数据库优化之索引优化
- 基于Spark的电影推荐系统(推荐系统~3)
- 小米路由器3 mysql_小米路由器3 opkg安装
- 找软件完全安装手册——【19年3月】各行业软件大全\系统安装、系统装机、软件安装、各种完全手册更新中(来自第一设计群)
- 如何更换安装鸿蒙系统,华为鸿蒙系统2.0如何进行安装?鸿蒙系统2.0安装方法详细介绍...
- 2022年版中国碳化硅(SiC)市场深度调研与投资可行性分析报告
热门文章
- Python pandas数据分列,分割符号固定宽度
- 201621123031 《Java程序设计》第4周学习总结
- 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)
- 莫尔斯编码的c语言实现,C程序-蓝桥-摩尔斯电码
- curl php 模拟来源_PHP cURL实现模拟登录与采集使用方法详解教程
- Unity中的Object和object的区别
- web SPA 移动端手机H5项目适配(vw+postcss)
- openwrt下有线网设置详细过程
- Python入门---顺序与选择结构
- 云计算机平台 显示器,云桌面