#sql #oracle
#sql #Oracle
Вопрос:
Привет, кто-нибудь может помочь мне сгенерировать номер версии на основе приведенных ниже данных таблицы
пример:
book_name version
math_1 1
physics_1 3
physics_6 4
chemist_1 1
chemist_2 2
eng_1 1
я хочу, чтобы запрос был повторно запущен ниже результата на основе приведенных выше табличных данных (особенно физики)
ожидаемый результат
book_name version
math_1 1
physics_1 1
physics_6 2
chemist_1 1
chemist_2 2
eng_1 1
Заранее спасибо
Ответ №1:
Для создания новой версии вам необходимо отделить тему от уровня. Как только вы это сделаете, простая ROW_NUMBER()
функция выполнит свою работу.
Например:
select x.*,
row_number() over(partition by subject order by lvl) as new_version
from (
select t.*,
substr(book_name, 1, instr(book_name, '_') - 1) as subject,
to_number(substr(book_name, 1 instr(book_name, '_'))) as lvl
from t
) x;
Результат:
BOOK_NAME version SUBJECT LVL NEW_VERSION
----------- --------- --------- ----- -------------
chemist_1 1 chemist 1 1
chemist_2 2 chemist 2 2
eng_1 1 eng 1 1
math_1 1 math 1 1
physics_1 3 physics 1 1
physics_6 4 physics 6 2
Смотрите Пример выполнения в db<>fiddle.
Ответ №2:
Аналогично (строки # 1-8 представляют образцы данных; вы не вводите это. Запрос, который возвращает желаемый результат, начинается со строки # 9):
SQL> with test (book_name, version) as
2 (select 'math_1' , 1 from dual union all
3 select 'physics_1', 3 from dual union all
4 select 'physics_6', 4 from dual union all
5 select 'chemist_1', 1 from dual union all
6 select 'chemist_2', 2 from dual union all
7 select 'eng_1' , 1 from dual
8 )
9 select book_name,
10 version,
11 row_number() over (partition by regexp_substr(book_name, '[[:alpha:]]')
12 order by to_number(regexp_substr(book_name, 'd $'))
13 ) new_version
14 from test
15 order by book_name, new_version;
BOOK_NAME VERSION NEW_VERSION
--------- ---------- -----------
chemist_1 1 1
chemist_2 2 2
eng_1 1 1
math_1 1 1
physics_1 3 1
physics_6 4 2
6 rows selected.
SQL>
Ответ №3:
Кажется, вам просто нужны последние цифры:
select t.*,
regexp_substr(book_name, '[0-9] $')
from t;
Вот скрипка db<> .
Комментарии:
1. Спасибо за ответ, но нет, я не ищу последнюю цифру, хочу сгенерировать новый номер версии, начинающийся с 1 для этой группы физики