Первым шагом является определение ids
значений, которые вы хотите рассмотреть.Один способ проверить длину и диапазон символов:
where length(ids) = 1
and ids between 'A' and 'Z'
, который делает некоторые предположения о вашем наборе символов, или использовать регулярное выражение, которое также делает некоторые предположения:
where regexp_like(ids, '^[A-Z]$')
или предпочтительно тот, который не использует класс вместо фиксированного диапазона:
where regexp_like(ids, '^[[:upper:]]$')
С вашими данными любой из них даст вам две строки, для B и C.
Тогда вынужно найти строку с максимальным значением ids
.Вы можете сделать самостоятельное соединение, которое немного расточительно;или используйте подзапрос, который вычисляет столбец ранжирования и затем фильтрует по нему:
select rn, ids
from (
select rn, ids, rank() over (order by ids desc) as rnk
from your_table
where regexp_like(ids, '^[[:upper:]]$')
)
where rnk = 1;
RN IDS
---------- ---
4 C
, или вы можете использовать вариант функции max()
с last
, чтобы сделать это за один шаг:
select max(rn) keep (dense_rank last order by IDs) as rn, max(ids)
from your_table
where regexp_like(ids, '^[[:upper:]]$');
RN MAX
---------- ---
4 C
Вы не сказали, что должно произойти, если есть связь, например, два значения rn
с C
.Первый из этих подходов покажет вам оба - но может быть изменен, чтобы показать только один, если вы можете указать, что вы хотите видеть.Второй покажет вам только один, который в настоящий момент не определен, так как в order by
нет информации о том, как разорвать связь.