栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ROW

ROW

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

下面还存在很多类似的函数,感兴趣可以了解。我看不下去了卷不动了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744962.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号