在Oracle中选择N + 1最高行(如果存在)或者返回Nth最高

时间:2013-11-16 05:12:39

标签: sql oracle oracle11g

在具有M列的表中,我希望列J中包含第(n + 1)个最高值的行给出第J列的第n个最高值。如果没有第(n + 1)个最高值列J,然后查询应返回包含列J中第n个最高值的行。 我是否可以使用rownum或rank()?

使用单个查询来完成此操作

例如在下表中,如果我想在B列上运行查询,

A     B     C
=============
1     3     4     -> ROW1
8     4     5     -> ROW2
9     5     2     -> ROW3
0     0     1     -> ROW4
  

QUERY(ROW1)=>返回ROW4,因为ROW4具有下一个最高值   Col B为0 QUERY(ROW2)=>返回ROW1,因为ROW1有下一个   Col B的最高值为3

     

但是如果我运行QUERY(ROW4),那么它应该返回ROW4本身   Col B没有其他较低的值。

下一个最高值是指以降序排序时的第N + 1个最高值。因此,最低值没有下一个最高值。

我可以使用单个查询执行此操作吗?

2 个答案:

答案 0 :(得分:1)

这样的东西?

WITH subquery AS (
  SELECT *,
         ROW_NUMBER() OVER (ORDER BY ColumnJ DESC) AS row_id
  FROM   table_name
)
SELECT *
FROM   subquery
WHERE  row_id = CASE WHEN :required_rank = (SELECT MAX(row_id) FROM subquery)
                     THEN :required_rank
                     ELSE :required_rank + 1 END;

答案 1 :(得分:0)

你的意思是:

SELECT * FROM some_table
WHERE B IN (SELECT nvl(max(B), ?) FROM some_table WHERE B < ?)

SQLFiddle示例。