sql - Oracle DB 表中的第二大值

标签 sql oracle top-n

<分区>

根据表格:

USERS (user_name, email, balance)

如何创建以最高效方式返回第二高用户余额的查询?

我成功地通过查询获得了这条记录(但不是通过有效的方式):

SELECT 
  * 
FROM  
  (SELECT 
    us.*,
    ROWNUM row_num
  FROM  
    (SELECT 
      u.*
    FROM
      users u
    ORDER BY
      u.BALANCE DESC) us
  WHERE
    ROWNUM < 3)
WHERE
  row_num > 1;

最佳答案

我会使用窗口函数:

select *
from (
  select u.*, dense_rank() over (order by balance desc) as rnk
  from users u
) t
where rnk = 2;

我不认为您的查询会有很大的性能差异(尤其是 balance 上的索引),但在我看来它更易于阅读和维护。

关于sql - Oracle DB 表中的第二大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100008/

相关文章:

java - 在 jooq 中设置 NULL 值

sql - 仅前 10 行的总和

sql - 如何在 Oracle 中产生排名

sql - MSSQL 通过 ID 从多列中获取最大值

MySQL 查询超时 - 需要加快速度

sql - 记录在案的 MySQL 连接可能不存在

MySQL 函数将工作日数添加到 DATETIME

sql - Oracle 自联接并与另一个表链接

c# - 扩展 NHibernate DriverConnectionProvider 类

sql - SAS 中删除重复项类似于 Oracle 中的 ROW_NUMBER () 函数