sql – 用于分组中最小值的Oracle Analytic函数
|
我是处理分析功能的新手. DEPT EMP SALARY ---- ----- ------ 10 MARY 100000 10 JOHN 200000 10 SCOTT 300000 20 BOB 100000 20 BETTY 200000 30 ALAN 100000 30 TOM 200000 30 JEFF 300000 我希望部门和员工的薪水最低. 结果应如下所示: DEPT EMP SALARY ---- ----- ------ 10 MARY 100000 20 BOB 100000 30 ALAN 100000 编辑:这是我的SQL(当然,它不起作用,因为它也希望group by子句中的人员): SELECT dept,emp,MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) FROM mytable GROUP BY dept 解决方法我认为Rank()函数不是这样的,有两个原因.首先,它可能比基于Min()的方法效率低. 原因是查询必须在扫描数据时维护每个部门所有工资的有序列表,然后通过重新读取此列表来分配等级.显然,如果没有可用于此的索引,则在读取最后一个数据项之前无法分配排名,并且列表的维护成本很高. 因此,Rank()函数的性能取决于要扫描的元素总数,如果数量足以使排序溢出到磁盘,则性能将崩溃. 这可能更有效: select dept,salary
from
(
SELECT dept,salary,Min(salary) Over (Partition By dept) min_salary
FROM mytable
)
where salary = min_salary
/
此方法仅要求查询为每个部门保留到目前为止遇到的最小值的单个值.如果遇到新的最小值,则修改现有值,否则丢弃新值.必须在内存中保留的元素总数与部门数量有关,而不是与扫描的行数有关. 可能是Oracle有一个代码路径来识别在这种情况下不需要计算Rank,但我不打赌它. 不喜欢Rank()的第二个原因是它只是回答了错误的问题.问题不在于“当每个部门的工资按升序排序时,哪些记录的工资是第一个排名”,它是“哪个记录的薪水是每个部门的最低工资”.至少对我来说这是一个很大的不同. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server-2005 – SQL Server 2005错误701 – 内存不足
- SQL Server 根据字符分割字符串的最好的写法分享
- sql server regex
- mysql 有关“InnoDB Error ib_logfile0 of different size”
- MySQL 获得当前日期时间的函数小结
- SQL中字符串比较与int连接的性能
- SQL2005学习笔记 EXCEPT和INTERSECT运算符
- sql-server-2008 – 由于变量为NULL而避免IF ELSE
- sql – 对表进行分区以获得真正好处的好大小(行数)是多少?
- sql-server-2008 – SSRS:如何将所有选项添加到SSRS下拉过
- SQL Server isnull在数据库查询应用示例
- sql – 在oracle树查询中加入其他表
- 后缀:错误:打开数据库/etc/postfix/generic.db
- 使用UNION运算符在SQL视图上创建索引?它真的会提
- data.table join with roll =“nearest”返回“搜
- 在Select中组合两个表(SQL Server 2008)
- sql-server – 查询SQL备份,日志文件和日志传送
- mapping – 具有多个joinColumns的Doctrine 2 Ma
- sql – 数据建模:是否需要使用交叉表?
- sql – 在命令两列具有相同值的列时,在postgres中
