首页 > 数据库 >SQL 开窗函数

SQL 开窗函数

时间:2023-03-08 17:22:15浏览次数:55  
标签:SALARY 函数 DD 30 114 开窗 SQL DEPARTMENT ID

一、开窗函数

开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:

1、over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数。

SELECT
    EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
    SUM(SALARY) OVER (ORDER BY SALARY) DD
FROM INFA_TEST.EMPLOYEES EMP
ORDER BY SALARY

功能:按salary升序排序,统计小于等于当前salary的salary总和。

返回结果:

    EMPLOYEE_ID SALARY MANAGER_ID DEPARTMENT_ID DD        
    132         2100   121        50            2100
    128         2200   120        50            6500
    136         2200   122        50            6500
    127         2400   120        50            11300
    135         2400   122        50            11300
    119         2500   114        30            26300
    140         2500   123        50            26300
    144         2500   124        50            26300
    191         2500   122        50            26300
    182         2500   120        50            26300

注意 SALARY为2200、2400和2500行的DD值
2、over(partition by DEPARTMENT_ID)按照部门分区。

SELECT 
    EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
    SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID) DD
FROM INFA_TEST.EMPLOYEES EMP
ORDER BY DEPARTMENT_ID

功能:按DEPARTMENT_ID分区,汇总各个部门的SALARY总和。

返回结果:

 EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
 200          4400     101          10              4400
 201          13000    100          20              19000
 202          6000     201          20              19000
 114          11000    100          30              24900
 115          3100     114          30              24900
 116          2900     114          30              24900
 119          2500     114          30              24900
 118          2600     114          30              24900
 117          2800     114          30              24900

注意 DEPARTMENT_ID为20,30的DD值

3、over(partition by DEPARTMENT_ID order by SALARY)按照部门分区。

SELECT 
    EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
    SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY) DD
FROM INFA_TEST.EMPLOYEES EMP
ORDER BY DEPARTMENT_ID

功能:按DEPARTMENT_ID分区,按SALARY升序排序,统计各个部门内部小于当前SALARY的和。

返回结果:

 EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
 200          4400     101          10              4400
 201          13000    100          20              6000
 202          6000     201          20              19000
 114          11000    100          30              2500
 115          3100     114          30              5100
 116          2900     114          30              7900
 119          2500     114          30              10800
 118          2600     114          30              13900
 117          2800     114          30              24900

注意 DEPARTMENT_ID为20、30的DD值和2中的区别

4、over(order by salary range between 50 preceding and 150 following)

SELECT 
    EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
    SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY

         RANGE BETWEEN 0 PRECEDING AND 100 FOLLOWING) DD
FROM INFA_TEST.EMPLOYEES EMP

ORDER BY DEPARTMENT_ID

功能:按DEPARTMENT_ID分区,按SALARY升序排序,汇总比当前SALARY大100的SALARY总和。

返回结果:

 EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
 200          4400     101          10              4400
 201          13000    100          20              6000
 202          6000     201          20              13000
 114          11000    100          30              5100
 115          3100     114          30              2600
 116          2900     114          30              5700
 119          2500     114          30              2900
 118          2600     114          30              3100
 117          2800     114          30              11000

解释:返回前置行和当前行SALARY相等,后续行比他大100的记录,在SALARY列上求和。

上下边界没有限制:OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)      

5、over(order by salary rows between 1 preceding and 2 following)-- 每行对应的数据窗口是之前行幅度值不超过1,之后行幅度值不超过2

SELECT
    EMPLOYEE_ID, SALARY, MANAGER_ID, DEPARTMENT_ID,
    SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY

         ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) DD
FROM INFA_TEST.EMPLOYEES EMP

ORDER BY DEPARTMENT_ID
返回结果

 EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
 200          4400     101          10              4400 
 201          13000    100          20              19000
 202          6000     201          20              19000
 114          11000    100          30              7900 
 115          3100     114          30              10800
 116          2900     114          30              11400
 119          2500     114          30              19800
 118          2600     114          30              17000
 117          2800     114          30              14100 
6、over(order by salary rows between unbounded preceding and unbounded following)
    over(order by salary range between unbounded preceding and unbounded following)

返回结果:

 EMPLOYEE_ID  SALARY   MANAGER_ID   DEPARTMENT_ID   DD
 200          4400     101          10              4400 
 201          13000    100          20              19000
 202          6000     201          20              19000
 114          11000    100          30              24900
 115          3100     114          30              24900
 116          2900     114          30              24900
 119          2500     114          30              24900
 118          2600     114          30              24900
 117          2800     114          30              24900

标签:SALARY,函数,DD,30,114,开窗,SQL,DEPARTMENT,ID
From: https://www.cnblogs.com/dengxing/p/17193960.html

相关文章

  • mysqlbinlog恢复数据实战
    binlog我们中文一般称作归档日志,如果大家看过松哥之前发的MySQL主从搭建,应该对这个日志有印象,当我们搭建MySQL主从的时候就离不开binlog(传送门:MySQL8主从复制踩坑指......
  • sqlparameter 动态参数
    dbparameter是sqlparameter的基类  List<DbParameter>DbParameters =newList<DbParameter>(); varwhere=string.Empty;if(!string.IsNullOrW......
  • [常用函数]模拟单击双击
    小程序需要模拟双击事件,如果一个元素既绑定了单击事件,又绑定了模拟的双击事件,如何区分两个事件何时触发呢? 1.设计一个点击事件分发函数如果用户两次点击的时间间隔不......
  • docker-compose部署mysql8的登录问题
    之前docker-compose部署mysql8的时候密码设置好,第一次启动容器,登录密码不对,需要登录容器跳过密码,重新修改密码启动,就研究了以下,就几个问题就弄好了docker-compose.yaml文......
  • leetcode刷题--两数之和/两数相加/关于class/enumerate()函数/TypeError: creat() mis
    Python中的self详细解析-初识CV的文章-知乎https://zhuanlan.zhihu.com/p/356325860关于classleetcode里面给出的class部分是不能删除的,否则会执行出错。关于class......
  • Centos7 离线安装 MySQL 8.0.32
    1官网下载mysql离线rpm包下载地址:https://dev.mysql.com/downloads/mysql/2将下载的tar包上传到/opt/rpm/mysql目录 3删除CentOS自带的mariadb 说明:不删的话my......
  • Django 实现Canal 读取 MySQL 写入到 Kafka中
    安装canal-python库:pipinstallcanal-python修改settings.py文件,添加Canal相关配置CANAL_SETTINGS={"canal_host":"127.0.0.1","canal_port":11111,......
  • 安装goldengate软件for mysql(ogg)
    os:centos7ogg版本:19.1.0.0.3mysql:5.71.将安装文件上传到指定的目录#cd/#mkdir/soft/ogg将ogg安装包上传到该目录2.创建安装软件的目录[root@localhost/]#cd/[ro......
  • 如何学习MySQL,这几本书初学者必看!
    《高性能MySQL》第四版发布后,收到了很多读者的反馈,其中关注最多的是作为一个初学者,应该如何能够较为系统的学习MySQL,从而应对日常工作或者获得更好的职业发展。于是和多个......
  • 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘
    摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。本文分享自华为云社区《【云图说】第270期云数据库GaussDB(forMySQL)......