Oracle分组取最大值

说到Oracle分组获取最大值,我之前也遇到过类似的问题。
我记得有一天,一位同事来找我,问我如何才能在甲骨文每个人的简历中找到排名最高的条目。
我想到了使用窗口函数ROW_NUMBER()来解决这个问题。

这就是我当时写的:
sql 选择 EMP_ID、CADRE_LEVEL 加班( 选择 EMP_ID、CADRE_LEVEL、 ROW_NUMBER() OVER (SECTION BY EMP_ID ORDER BY CADRE_LEVEL DESC) AS rn 来自 P_RESUME ) 其中 rn = 1
该SQL语句的原理如下:首先在内层查询中,使用ROW_NUMBER()函数将每个员工的简历按CADRE_LEVEL降序排序,并分配行号。
那么外层查询只选择行号为1 的记录,即每个员工职位最高的记录。

但是,顺便说一句,我从未遇到过同一个员工多次申请最高职位的情况。
在这种情况下,您可能必须将 ROW_NUMBER() 替换为 RANK() 或 DENSE_RANK(),以确保只为每个员工返回一条记录。

还有一件事:不要忘记检查 CADRE_LEVEL 字段的数据类型以确保它可以排序。
例如,如果是字符串类型,最好使用数值或可排序的字符串。

至于替代方案,Oracle还有一个KEEP子句,使用起来相当方便。
我记得曾经使用这种方法来简化查询:
sql 选择 EMP_ID、MAX(CADRE_LEVEL) 保存(DENSE_RANK FIRST ORDER BY CADRE_LEVEL DESC)为 CADRE_LEVEL 来自 P_RESUME 按 EMP_ID 分组
该方法直接使用MAX函数和KEEP子句来获取每组中CADRE_LEVEL最高的记录,相当简单。

总之,这几种方法都比较实用,但具体使用哪一种还要根据实际情况而定。
我这里可能有点苛刻,但我认为SQL查询的关键是多实践、多研究。

SQL Server怎么查询前3行数据的最大值

等等,我昨天在调试代码时遇到了一些奇怪的事情。
一个数据库表包含数百条记录。
用TOP3 查看最大值,每次结果都不一样。
检查了半天,发现是数据修改导致的。
TOP3 的评选没有固定的顺序,而是随机的。
按数量排序,取前3 名结果会趋于稳定。
例如,将 SQL 重写为 SELECTTOP3 amountFROMordersORDERBYamountDESC;只有这样你才能确保获得真正的最大值。
但是,如果表有数百列。
排序会影响性能吗?我检查了文档,SQL Server将为排序列创建一个临时表,这实际上有点慢。
但几百条数据影响不大。
如果表有数百万个碎片。
您可能需要考虑添加索引。
这篇TOP文章使用起来非常方便;但你需要了解它的底层实现。
我突然想到,如果表中有重叠的金额,当我取TOP3 的最高值时,会有很多相同的值。
例如,如果三个订单都是 1 ,000。
是退回三张一千还是只退回一张?你必须尝试去了解这一点。