Sql 选择Oracle中第N+1行(如果存在),否则返回第N行

Sql 选择Oracle中第N+1行(如果存在),否则返回第N行,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,在一个有M列的表中,如果列J的第n个最高值,我需要包含列J中第n+1个最高值的行。如果列J中没有第n+1个最高值,则查询应返回包含列J中第n个最高值的行。 我是否可以通过使用rownum或rank的单个查询来实现这一点 例如,在下表中,如果我想对B列运行查询 A B C ============= 1 3 4 -> ROW1 8 4 5 -> ROW2 9 5 2 -> ROW3 0

在一个有M列的表中,如果列J的第n个最高值,我需要包含列J中第n+1个最高值的行。如果列J中没有第n+1个最高值,则查询应返回包含列J中第n个最高值的行。 我是否可以通过使用rownum或rank的单个查询来实现这一点

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

A     B     C
=============
1     3     4     -> ROW1
8     4     5     -> ROW2
9     5     2     -> ROW3
0     0     1     -> ROW4
QUERYROW1=>返回第4行,因为第4行的 列B为0 QUERYROW2=>返回行1,因为行1具有下一个 列B的最大值为3

但是如果我运行QUERYROW4,它应该返回ROW4本身,因为有 B列没有其他较低的值

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


我是否可以使用单个查询来完成此操作?

您的意思是:

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

例如。

你的意思是:

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

像这样的东西

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;
像这样的

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;

好吧,也许是我的脑子不好,但我已经把你的问题重读了好几遍,我仍然不知道目标是什么。您说QUERYROW1=>返回第4行,因为第4行的列B的下一个最高值是0。但是,B列,第1行是3,第二个最大值是4,在第2行,然后是第3行的5。第4行有0,小于3。所以,你可以在这里看到我的困惑。请提供一个更好的输入和所需输出的示例。抱歉造成混淆。下一个最高值是指按降序排序时的N+1个最高值。因此,对于最低值,没有下一个最高值。只是添加了编辑。事实上,这对我来说没有任何澄清。您想要列J的第n个最大值,但没有列J,只有A、B和C。然后查询行1以获得行4???那对我来说毫无意义。抱歉。当您按降序对列B进行排序时,顺序如下:第3行第2行第1行第4行,因此如果我的输入是第1行,则查询应返回第4行。如果我的输入是第2行,查询应该返回第1行,但是如果我的输出是第4行,那么输出应该是第4行本身。既然没有比Col BOk更低的价值了,也许是我的思想太弱了,但我已经多次重读了你的问题,我仍然不知道目标是什么。您说QUERYROW1=>返回第4行,因为第4行的列B的下一个最高值是0。但是,B列,第1行是3,第二个最大值是4,在第2行,然后是第3行的5。第4行有0,小于3。所以,你可以在这里看到我的困惑。请提供一个更好的输入和所需输出的示例。抱歉造成混淆。下一个最高值是指按降序排序时的N+1个最高值。因此,对于最低值,没有下一个最高值。只是添加了编辑。事实上,这对我来说没有任何澄清。您想要列J的第n个最大值,但没有列J,只有A、B和C。然后查询行1以获得行4???那对我来说毫无意义。抱歉。当您按降序对列B进行排序时,顺序如下:第3行第2行第1行第4行,因此如果我的输入是第1行,则查询应返回第4行。如果我的输入是第2行,查询应该返回第1行,但是如果我的输出是第4行,那么输出应该是第4行本身。由于子查询为select rownum作为row_id的列B没有更低的值,所以A、B、C从select*从test_表中按C select*从子查询中选择,其中row_id=CASE当:rank=从子查询中选择MAXrow_id时,则:rank ELSE:rank+1 END;此查询适用于上面的表,子查询为select rownum作为row_id,A、B、C从select*从test_表中按C select*从子查询中选择,其中row_id=CASE时:rank=从子查询中选择MAXrow_id然后:rank ELSE:rank+1 END;此查询适用于上表