2013-11-16 2 views
0

В таблице с M столбцами я хочу, чтобы строка, содержащая (n + 1) -е наивысшее значение в столбце J, учитывала n-е наивысшее значение Столбец J. Если нет (n + 1) -го наивысшего значения столбца J, тогда запрос должен возвращать строку, содержащую n-е наивысшее значение в столбце J. Возможно ли, что я могу сделать это, используя один запрос, используя rownum или rank()?Выбор N + 1-й самой высокой строки в Oracle, если она существует или возвращает Nth наивысший

Например, в приведенной ниже таблице, если я хочу, чтобы выполнить запрос на колонке Б,

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-е наивысшее значение при сортировке по убыванию. Таким образом, для наименьшего значения нет следующего наивысшего значения.

Возможно ли, что я могу сделать это, используя один запрос?

+0

Хорошо, может быть, это мой слабый ум, но я перечитал ваш вопрос несколько раз, и я ВСЕ ЕЩЕ * не знаю *, в чем цель. Вы говорите: «QUERY (ROW1) => возвращает ROW4, поскольку ROW4 имеет следующее самое высокое значение для Col B, которое равно 0». Но, Col B, ROW1 равно 3, следующее самое высокое значение - 4, которое находится в ROW2, а затем 5, которое находится в ROW3. ROW4 имеет 0, что на * меньше * 3. Таким образом, вы можете увидеть мое замешательство здесь. Пожалуйста, дайте лучший пример входов и желаемых результатов. –

+0

Извините за путаницу. К следующему наивысшему я имею в виду N + 1-е наивысшее значение при сортировке в порядке убывания. Таким образом, для наименьшего значения нет следующего наивысшего значения. Просто добавлено редактирование. – PuppyHeadedNinja

+0

Это на самом деле ничего не разъясняет для меня. Вы хотите n-е наивысшее значение столбца J, но нет столбца J, только A, B и C. Затем вы запрашиваете ROW1 для получения ROW4 ??? Это не имеет никакого смысла для меня вообще. Сожалею. –

ответ

0

ли вы имеете в виду что-то вроде:

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

SQLFiddle пример.

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; 
+0

Perfect. Это работало для меня с незначительным редактированием. – PuppyHeadedNinja

+0

С подзапросом AS (выберите rownum as row_id, A, B, C from (выберите * из test_table по C)) SELECT * FROM подзапроса WHERE row_id = CASE WHEN: rank = (SELECT MAX (row_id) FROM в подзапросе) THEN: rank ELSE: rank + 1 END; Этот запрос работает для приведенной выше таблицы – PuppyHeadedNinja

Смежные вопросы