сгенерировать порядковый номер

#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 для этой группы физики