EMP表是Oracle测试账户SCOTT中的一张雇员和非雇员表首先,我们来看看emp表的数据
其中empno是员工编号,同时也是该表的主键ename是员工姓名,sal是员工工资deptno是员工部门。
如何找出每个部門的最高工资的员工信息呢
常用的方法是关联查询,SQL语句如下:
下面我们来看看执行计划:
不难看出该查询针对同一个表走了两次全盤扫描,成本为7逻辑读为13。
如何对上述查询进行优化呢在这里,用到分析函数LAST_VALUELAST_VALUE返回排序集中的最后一个值。
不难看出sal等于maxsal的行即為每个部门最高工资的员工,下面用嵌套子查询得到目标结果。
下面我们来看看该语句的执行计划:
可见引入了分析函数以后,成本和逻輯读都减少了一半
通过查询的结果,我们可以看出20号部门有两个人的工资最高,有时候我们只想得到一个人的信息,如何实现呢
茬这里我们会用到分析函数LAG,具体SQL如下:
在实际生产环境中此类应用还是蛮多的,譬如如何查询每个时段耗时最大的工单当然,通过仩述演示我们也看出了group by函数的局限性。
关于LAST_VALUE和LAG函数的具体应用及说明可参考Oracle官方文档: