【SQL】MySQL中的窗口函数(开窗函数)

这篇具有很好参考价值的文章主要介绍了【SQL】MySQL中的窗口函数(开窗函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

窗口函数是MYSQL8.0新增的

聚合函数: 多行变一行,常见的sum,count,max,min
窗口函数: 行数不变,常见的row_number,rank

语法格式:

窗口函数(表达式) over (partition by … order by … frame_clause)
partition by是分区,类似于group by,如去掉相当于对所有数据进行计算
order by排序
frame_clause用于在分区内指定窗口大小,指定计算的区域


表employee
字段
dname 部门
ename 员工
hiredate 入职日期
salary 薪水
使用场景:
一、分组排序

-- 每个部门的员工按薪水由高到低排序并添加序号
select 
dname,
ename,
salary,
row_number() over (partition by dname order by salary desc) as 序号
from employee 

二、分组累加

-- 每个部门的员工薪水从高到低排序,每个部门薪水累加
select 
dname,
ename,
salary,
sum(salary) over (partition by dname order by salary desc) as 累计值
from employee 

三、分组求和

-- 每个部门薪水总和,相比group by dname求和来说,这里返回的条数不会变少
select 
dname,
ename,
salary,
sum(salary) over (partition by dname) as 部门薪水总和
from employee 

四、向前取向后取

-- lag(salary,1,100)返回上一行的salary值,上一行没值默认为100
-- lag(salary,5,100)返回上五行的salary值,上一行没值默认为100
-- lead()返回下n行的值,用法与lag相同
select 
dname,
ename,
salary,
lag(salary,1,0) over(partition by dname order by salary) as 前一名的薪水,
lag(salary,2) over(partition by dname order by salary) as 前两名的薪水
from employee

五、组内第一个/最后一个的值

-- 头尾函数first_value、last_value
-- first_value取分组内第一个的值
-- last_value取分组内最后一个的值(由于默认计算窗口是从首行到当前行,因此直接使用的话就是取当前行的值,需要指定窗口为首行到最后一行,才能真正实现取组内最后一个值)
select 
dname,
ename,
hiredate,
salary,
first_value(salary) over(partition by dname order by hiredate) as 部门首次入职员工薪资
from employee

六、组内第n个的值

-- nth_value取分组内第n个值(未指定窗口大小则为首行截止到当前行的第n个,不够n个就是null)
select 
dname,
ename,
hiredate,
salary,
nth_value(salary,2) over(partition by dname order by hiredate) as 部门内第二个入职员工薪资
from employee

七、平均分组

-- ntile平均分组
select 
dname,
ename,
hiredate,
salary,
ntile(3) over(partition by dname order by hiredate) as 部门内的组号
from employee

指定窗口大小(计算区域):文章来源地址https://www.toymoban.com/news/detail-732339.html

-- 控制开窗函数的计算区域
-- 指定范围首行到当前行(默认是这个)
rows between unbounded preceding and current row
-- 指定范围前3行到当前行
rows between 3 preceding and current row 
-- 指定范围前3行到后1行
rows between 3 preceding and 1 following
-- 指定范围当前行到最后行
rows between current row and unbounded following
/*
unbounded preceding  首行 
current row          当前行
unbounded following  最后行
n preceding          前n行
n following          后n行
*/ 

到了这里,关于【SQL】MySQL中的窗口函数(开窗函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL8.0数据库开窗函数

          数据库开窗函数是一种在SQL中使用的函数,它可以用来对结果集中的数据进行分组和排序,以便更好地分析和处理数据。开窗函数与聚合函数不同,它不会将多行数据聚合成一行,而是保留每一行数据,并对其进行分组和排序。 常见的开窗函数包括ROW_NUMBER()、RANK()、

    2024年02月08日
    浏览(64)
  • mysql 8.0 窗口函数 之 分布函数 与 sql server (2017以后支持) 分布函数 一样

    mysql 分布函数 percent_rank() :等级值 百分比 cume_dist() :累积分布值 percent_rank() 计算方式 (rank-1)/(rows-1), 其中 rank 的值为使用RANK()函数产生的序号,rows 的值为当前窗口的总记录数。

    2024年02月11日
    浏览(42)
  • MySQL数据库基础(三):多表查询,子查询,开窗函数

    表与表之间的关系 在SQL语句中,数据表与数据表之间,如果存在关系,一般一共有3种情况: ① 一对一关系(高级) 比如有A、B两张表,A表中的每一条数据,在B表中有一条唯一的数据与之对应。 用户表user user_id(用户编号) 账号username 密码password 001 admin admin888 002 itheima

    2024年02月12日
    浏览(45)
  • MySQL数据库中的索引(含SQL语句)

    假设有一张表,表中有100万条数据,这100万条数据在硬盘上是存储在数据页上的,一页数据大小为16k。存储100万条数据那么就需要数据页,假设其中有一条数据是“id为7900”的,那么如果要查询这条数据,其中SQL是SELECT * FROM 表名 WHERE id = 7900。在执行这条SQL语句的时候,MyS

    2024年02月02日
    浏览(79)
  • MySQL5.7服务器 SQL 模式

      官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册  /  ...  /  服务器 SQL 模式 5.1.10 服务器 SQL 模式 MySQL服务器可以在不同的SQL模式下运行,并且可以根据系统变量的值对不

    2024年02月03日
    浏览(39)
  • 数据库SQL函数 根据身份证号/出生年月 精确计算年龄(Oracle/MySQL)

    问题 根据身份证号统计年龄(18位) Oracle 思路 (1)Substr()函数在Oracle使用中表示被劫取的字符串表达式,截取字符串的内容。 (2)To_date()函数可以转换不同格式的日期,通过使用to_date函数可以将字符串类型的日期转换成date格式。 (3)Months_between()函数反悔两个日期之间的

    2024年02月11日
    浏览(50)
  • MySQL数据库干货_16—— SQL99标准中的查询

    SQL99标准中的查询 MySQL5.7 支持部分的SQL99 标准。 SQL99中的交叉连接(CROSS JOIN) 示例: 使用交叉连接查询 employees 表与 departments 表。 SQL99中的自然连接(NATURAL JOIN) 自然连接 连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL J

    2024年02月06日
    浏览(62)
  • 基于Linux操作系统中的MySQL数据库SQL语句(三十一)

    MySQL数据库SQL语句 目录 一、SQL语句类型 1、DDL 2、DML 3、DCL 4、DQL 二、数据库操作 1、查看 2、创建 2.1、默认字符集 2.2、指定字符集 3、进入  4、删除 5、更改 6、练习 三、数据表操作 (一)数据类型 1、数值类型 1.1、TINYINT 1.2、SMALLINT 1.3、INT 1.4、BIGINT 1.5、FLOAT(M,D) 2、时间

    2024年02月15日
    浏览(67)
  • 关系数据库-9-[mysql8]中的语法校验规则sql_mode应用

    Mysql中sql_mode使用详解 sql_mode是一组mysql的语法校验规则,定义了mysql应该支持的sql语法、数据校验等。 1.3.1 ANSI模式 这是一种宽松模式,该模式下,会对所操作数据进行校验,如果不符合校验规则,数据会按照规则执行,并报warning警告。 1.3.2 STRICT_TRANS_TABLES模式 这是一种严格

    2024年02月02日
    浏览(48)
  • MySql5.6版本开启慢SQL功能-本次采用永久生效方式

    开启 MySQL 的慢查询日志(Slow Query Log)可以帮助你分析和优化数据库中的慢查询语句。通过记录执行时间超过阈值的 SQL 查询,慢查询日志能够提供以下用途: 性能优化 : 慢查询日志能够帮助你找出执行时间较长的 SQL 查询语句,以及执行次数较多的查询。通过分析这些慢查

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包