Описание случая водопада

Попробуйте следующее:

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 .

Код отсюда: Сортировка для людей: естественный порядок сортировки .

-2
задан Joshua Tinashe 16 January 2019 в 17:00
поделиться

1 ответ

Случайное выражение прекращает оценивать термины, как только находит совпадение. Поэтому я думаю, что вы задаете не тот вопрос. Не похоже, что вам действительно нужно выражение падежа.

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

db <> fiddle

После вашего редактирования, если номера рейтинга не в числовом порядке, вы можете добавить выражение случая обратно в предложение 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;

Обновлен db <> fiddle

0
ответ дан Alex Poole 16 January 2019 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: