热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:常用分析函数开窗讲解

1.工资排序后取第一行到当前行范围内的最小值selectename,sal,*因是按工资排序,所以这个语句返回的结果就是所有行的最小值*min(sal)over(orderbysa

 1.工资排序后取第一行到当前行范围内的最小值
select ename,
    sal,
    /*因是按工资排序,所以这个语句返回的结果就是所有行的最小值*/
    min(sal) over(order by sal) as min_11,
    /*上述语句默认参数如下,plan中可以看到*/
    min(sal) over(order by sal range between unbounded preceding and current row) as min_12,
    /*这种情况下,rows与range返回数据一样*/
    min(sal) over(order by sal rows between unbounded preceding and current row) as min_13,
    /*取所有行内最小值,可以与前面返回的值对比查看*/
    min(sal) over() as min_14,
    /*如果明确写出上面min_14的范围就是*/
    min(sal) over(order by sal range between unbounded preceding and unbounded following) as min_15,
    /*这种情况下,rows与range返回数据一样*/
    min(sal) over(order by sal rows between unbounded preceding and unbounded following) as min_16
 from emp
where deptno=30;

ENAME                      SAL     MIN_11     MIN_12     MIN_13     MIN_14      MIN_15     MIN_16
—————————— ———- ———- ———- ———- ———- ———- ———-
JAMES                      950     950        950        950      950         950    950
WARD                     1250     950        950        950      950         950    950
MARTIN                     1250     950        950        950      950         950    950
TURNER                     1500     950        950        950      950         950    950
ALLEN                     1600     950        950        950      950         950    950
BLAKE                     2850     950        950        950      950         950    950

6 rows selected.

 2.工资排序后取第一行到当前行范围内的最大值
select ename,
    sal,
    /*因是按工资排序,所以这个语句与上面sal返回的值一样*/
    max(sal) over(order by sal) as max_11,
    /*上述语句默认参数如下,plan中可以看到*/
    max(sal) over(order by sal range between unbounded preceding and current row) as max_12,
    /*这种情况下,rows与range返回数据一样*/
    max(sal) over(order by sal rows between unbounded preceding and current row) as max_13,
    /*取所有行内最大值,可以与前面返回的值对比查看*/
    max(sal) over() as max_14,
    /*如果明确写出上面max_14的范围就是*/
    max(sal) over(order by sal range between unbounded preceding and unbounded following) as max_15,
    /*这种情况下,rows与range返回数据一样*/
    max(sal) over(order by sal rows between unbounded preceding and unbounded following) as max_16
 from emp
where deptno=30;

ENAME                      SAL     MAX_11     MAX_12     MAX_13     MAX_14      MAX_15     MAX_16
—————————— ———- ———- ———- ———- ———- ———- ———-
JAMES                      950     950        950        950     2850        2850       2850
WARD                     1250    1250       1250       1250     2850        2850       2850
MARTIN                     1250    1250       1250       1250     2850        2850       2850
TURNER                     1500    1500       1500       1500     2850        2850       2850
ALLEN                     1600    1600       1600       1600     2850        2850       2850
BLAKE                     2850    2850       2850       2850     2850        2850       2850

6 rows selected.

3.工资排序后取第一行到当前行范围内的工资和,这里要注意区别。
select ename,
    sal,
    /*累加工资,要注意工资重复时的现象*/
    sum(sal) over(order by sal) as sum_11,
    /*上述语句默认参数如下,plan中可以看到*/
    sum(sal) over(order by sal range between unbounded preceding and current row) as sum_12,
    /*这种情况下,rows与range返回数据不一样,见第二行*/
    sum(sal) over(order by sal rows between unbounded preceding and current row) as sum_13,
    /*工资合计*/
    sum(sal) over() as sum_14,
    /*如果明确写出上面sum_14的范围就是*/
    sum(sal) over(order by sal range between unbounded preceding and unbounded following) as sum_15,
    /*这种情况下,rows与range返回数据不一样*/
    sum(sal) over(order by sal rows between unbounded preceding and unbounded following) as sum_16
 from emp
where deptno=30;       

ENAME                      SAL     SUM_11     SUM_12     SUM_13     SUM_14      SUM_15     SUM_16
—————————— ———- ———- ———- ———- ———- ———- ———-
JAMES                      950     950        950        950     9400        9400       9400
WARD                     1250    3450       3450       2200     9400        9400       9400
MARTIN                     1250    3450       3450       3450     9400        9400       9400
TURNER                     1500    4950       4950       4950     9400        9400       9400
ALLEN                     1600    6550       6550       6550     9400        9400       9400
BLAKE                     2850    9400       9400       9400     9400        9400       9400

6 rows selected.

 因为使用关键字‘RANGE’时,第二行‘SUM_11’、‘SUM_12’对应的条件是‘<=1250’,而1250有两个,所以会计算两次,产生的结果为:950+1250+1250=3450。而‘SUM_13‘不同,它只计算到当前行,所以结果是950+1250=2200。
 
 4.前后都有限定条件
select ename,
        sal,
        /*当前行(+-500)范围内的最大值*/
        max(sal) over(order by sal range between 500 preceding and 500 following) as max_11,
        /*前后各一行,共三行中的最大值*/
        max(sal) over(order by sal rows between 1 preceding and 1 following) as max_12
 from emp
where deptno=30;

ENAME                      SAL     MAX_11     MAX_12
—————————— ———- ———- ———-
JAMES                      950    1250       1250
WARD                     1250    1600       1250
MARTIN                     1250    1600       1500
TURNER                     1500    1600       1600
ALLEN                     1600    1600       2850
BLAKE                     2850    2850       2850

6 rows selected.

需要了解更多数据库技术:常用分析函数开窗讲解,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“的个人题解目录
    本文是2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“的个人题解目录。文章介绍了皮亚诺曲线的概念和特点,并提供了计算皮亚诺曲线上两点距离的方法。通过给定的两个点的坐标,可以计算出它们之间沿着皮亚诺曲线走的最短距离。本文还提供了个人题解的目录,供读者参考。 ... [详细]
author-avatar
小怡的宝_594
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有