Попробуйте следующее:
import re
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
Выход:
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
См. его в режиме онлайн: ideone .
Код отсюда: Сортировка для людей: естественный порядок сортировки .
Случайное выражение прекращает оценивать термины, как только находит совпадение. Поэтому я думаю, что вы задаете не тот вопрос. Не похоже, что вам действительно нужно выражение падежа.
Из ваших выборочных данных и результатов вы, кажется, хотите получить агрегат, используя first
, что-то вроде:
select dt1.company_id,
max(dt1.unique_entry_id)
keep (dense_rank first order by dt1.rating_number) as unique_entry_id
from comp_results dt1
group by dt1.company_id;
COMPANY_ID UNIQUE_ENTRY_ID
-------------------- --------------------
Org00001 ENTRY_C1_1
Org00002 ENTRY_C2_2
Org00003 ENTRY_C3_3
Это все равно оценивает каждую строку, но затем агрегирует и сохраняет тот, который имеет самый низкий rating_number
- который соответствует порядку приоритета, который вы хотите.
После вашего редактирования, если номера рейтинга не в числовом порядке, вы можете добавить выражение случая обратно в предложение order by
, чтобы указать желаемый порядок:
select dt1.company_id,
max(dt1.unique_entry_id) keep (dense_rank first
order by case dt1.rating_number
when 2 then 1
when 1 then 2
when 3 then 3
end) as unique_entry_id
from comp_results dt1
group by dt1.company_id;