SQL开窗函数

文章目录

开窗函数(分析函数)

写法

复制代码
分析函数名() OVER(分析子句)

分析函数名

聚合类:

SUM AVG MIN MAX COUNT

排序类:

row_number()

RANK()

dense_rank()

分析子句

PARTITION BY 分组内容

ORDER BY 排序内容

ROWS 窗口(用的不多)

聚合类:

SUM AVG MIN MAX COUNT --聚合开窗

例题:查询员工的姓名岗位薪资以及该员工对应的部门平均薪资

复制代码
SELECT ename,job,sal,AVG(sal) OVER(PARTITION BY deptno) a FROM emp;

练习:

查询员工工资比该员工所在岗位平均薪资高的员工信息

复制代码
SELECT *
  FROM (SELECT EMP.*, AVG(SAL) OVER(PARTITION BY JOB) A FROM EMP)
 WHERE SAL > A;

注意:

1.聚合开窗的时候,分析函数名必须有内容,即AVG() 括号里必须要有东西

2.分析子句没有要求

排序类:

row_number()

RANK()

dense_rank() --排序开窗

区别

复制代码
SELECT ENAME,
       SAL,
       DEPTNO,
       ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL),--不考虑并列  1234567
       RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL), --考虑并列 跳过并列1224567
       DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL) --考虑并列,不跳过并列 1223456
       FROM emp;

练习:查询每个部门工资的前两名

复制代码
SELECT *
  FROM (SELECT ENAME,
               RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL) A,
               DEPTNO
          FROM EMP)
 WHERE A <= 2

注意:

1.分析函数名内是不需要有东西的

2.分析子句里必须有 order BY

偏移类

LAG() LEAD() --偏移开窗

尚未学习

相关推荐
Zan6 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶7 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
SelectDB8 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹9 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
爱吃奥利奥_wen9 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
这个DBA有点耶10 小时前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
测试界的小码农12 小时前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j
x_SpiderMan12 小时前
搭建Oracle RAC 集群
数据库·oracle
测试界的小码农12 小时前
【图数据库实战进阶(03):Neo4j 图数据建模实战——节点、关系与属性应该怎么设计?】
数据库·oracle·neo4j