首页 > 数据库 >sql中的窗口函数

sql中的窗口函数

时间:2023-02-18 19:34:07浏览次数:37  
标签:salary 窗口 函数 over 行号 sql row

一、简述

窗口函数常用的有排序窗口函数,聚合窗口函数,使用时一般是这种格式

函数名() over(PARTITION by 字段名 ORDER BY 字段名)

二、排序窗口函数

假设有这样一张员工表

现在需要实现这样一种查询效果,将所有员工按照部门分组进行展示,组内的人员按照salary进行升序排列.

这时就要使用排序窗口函数

1.row_number

select *,row_number() over(PARTITION by dept_name ORDER BY salary) as num1 from emp_table;

以上这个sql使用row_number实现把所有员工按部门名分组,组内按salary排序,最终会得到这样的效果

其中num1是使用row_number函数后得到的分组内的行号,这个函数的特点就是行号是递增的,即使两条记录排序字段相等,行号也递增,例如图中的张三和王五这俩人salary相等,num1分别为1和2

2.rank

rank函数也是排序窗口函数作用和row_number类似,只是在生成行号时遇到salary相同的记录时处理方式不同,

select *,rank() over(PARTITION by dept_name ORDER BY salary) as num1 from emp_table;

会得到如下的效果

关注张三和王五这两个人,他们salary一样,所以生成的行号都是1,同时下一个人李四的行号是3,把2跳过了。

3.dense_rank

dense_rank函数也是排序窗口函数作用和row_number类似,只是在生成行号时遇到salary相同的记录时处理方式不同,

select *,dense_rank() over(PARTITION by dept_name ORDER BY salary) as num1 from emp_table;

会得到如下的效果图

关注张三和王五这两个人,他们salary一样,所以生成的行号都是1,但下一个人的行号是2,产生了一个排名并列的效果,这就是和rank函数的区别。

二、聚合窗口函数

现在需要在上边按部门分组的基础上给每一行展示部门内salary的总数和平均数,这时就可以使用sum和avg这两个聚合函数

select *,row_number() over(PARTITION by dept_name ORDER BY salary) as row_num,
sum(salary) over(PARTITION by dept_name) as salary_sum ,
avg(salary) over(PARTITION by dept_name) as salary_avg
from emp_table;

上边的sql会得到这样的效果图,人员按部门分组后每一行记录都带上了本部门的总salary和平均数。

当然还有类似max,min,count这样的聚合函数可以使用。

那么窗口函数中使用的聚合函数和普通使用的聚合函数有什么区别呢?

普通使用的聚合函数最终得到的是一行记录,例如SELECT count(1) from emp_table; 这样得到的是一个全表的总记录数。

而在窗口函数中使用的聚合函数,不会改变返回记录的行数,它会把聚合函数的结果拼在每一行上。

SELECT count(1) over() as total from emp_table;

这个sql会得到这样的结果

这样就可以得到一种查询员工的详细信息同时附带员工总人数的效果

这就是普通聚合函数和窗口聚合函数的区别

标签:salary,窗口,函数,over,行号,sql,row
From: https://www.cnblogs.com/chengxuxiaoyuan/p/17133356.html

相关文章

  • sql实现24小时归因
    withpopupas(--弹窗点击selectdistinct_id,sc_user_id,timeclick_at,test_flag,plan_id,bucket_desc,exper_i......
  • 纯虚函数和抽象类
    纯虚函数和抽象类纯虚函数是一种特殊的虚函数,在某些情况下,基类中不能对虚函数给出有意义的实现,把它声明为纯虚函数。纯虚函数只有函数名、参数和返回值类型,没有函数体,具......
  • MySQL数据库
    MySQL数据库一、MySQL数据库的介绍1、发展史1996年,MySQL1.02008年1月16号Sun公司收购MySQL。2009年4月20,Oracle收购Sun公司。MySQL是一种开放源代码的关系型数据库......
  • 过程和函数的作用域
    在单元接口interface部分声明的过程或函数在整个单元内有效。当其他单元(客户单元)引用该单元时,这些过程和函数可以被其他客户单元使用。unitUnitl;//单元首部int......
  • 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新
    写在前面关于Playwright系列的文章,真的很久没有写了,今天一个不小心官方API部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习。API部分多线程直白点说就是......
  • 【Android逆向】frida hook so 函数
    1.apk来自52pojie链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ密码:u1an2.apktool反编译apk,拿到so文件java-jar../apktool_2.2.4.jardapp-debug.apk3.......
  • SQL248 平均工资
    题目描述查找排除在职(to_date='9999-01-01')员工的最大、最小salary之后,其他的在职员工的平均工资avg_salary。思路1.求单列平均值使用聚合函数avg();2.排除在职(......
  • mysql锁机制以及优化
    锁分类从性能上划分乐观锁适合读多的场景悲观锁适合写多的场景从操作粒度划分表锁一般用作数据迁移、开销小加锁快手动加表锁locktable表名称read(write),表......
  • MySQL的几个常见命令
    1、查看mysql的安装路径进入到mysql的命令行或者mysql可视化查询工具的界面,输入下面的指令showvariableslike"%char%";character_sets_dir就是mysql的安装目录2、......
  • Windows系统下安装MySQL8高版本(已安装MySQL5)
    Windows系统下安装MySQL8高版本(已安装MySQL5)​​一、MySQL安装包下载地址​​​​二、安装步骤​​​​三、参考资料​​一、MySQL安装包下载地址MySQL国内镜像安装地址:htt......