Автоинкремент для каждого повторяющегося значения в Oracle

Я использую Oracle Database Integrator (ODI) для создания интерфейса для новой таблицы.

Я пытаюсь постепенно увеличивать число для каждого повторяющегося появления значения в другом столбце. Например, для таблицы:

Person_ID  | ...
32         | ...
45         | ...
32         | ...
67         | ...
45         | ...
45         | ...

Интерфейс выведет в целевую таблицу следующее:

Person_ID | Sequence_Number | ...  
32        |       1         | ...
45        |       1         | ...
32        |       2         | ...
67        |       1         | ...
45        |       2         | ...
45        |       3         | ...

Я пытался сделать это, вводя различные SQL-запросы в текстовый редактор «Реализация» в Mapping Properties, но мне кажется, что я не могу заставить его постепенно увеличиваться.

Любая помощь будет принята с благодарностью!


person DatabaseAdministrator1    schedule 15.04.2015    source источник


Ответы (1)


вы можете использовать row_number() или rank() с over(partition by personId order by personId)

select personId,
       row_number() over(partition by personId order by personId) Sequence_Number
from your_table

Изменить: если вы хотите, чтобы результат был отсортирован точно так же, как желаемый результат, который вы упомянули, вам нужно сделать order by rownum дважды, чтобы гарантировать желаемую сортировку:

select personId,
       row_number() over(partition by personId order by rownum) Sequence_Number
from your_table
order by rownum

Ниже приведена проверка для вышеуказанных запросов:


SQL> create table your_table (personId int);

Table created.

SQL> insert all
  2      into your_table values(32)
  3      into your_table values(45)
  4      into your_table values(32)
  5      into your_table values(67)
  6      into your_table values(45)
  7      into your_table values(45)
  8      select * from dual;

6 rows created.

SQL> commit;

Commit complete.

SQL> select personId,
  2         row_number() over(partition by personId order by rownum) Sequence_Number
  3  from your_table;

  PERSONID SEQUENCE_NUMBER
---------- ---------------
        32               1
        32               2
        45               1
        45               2
        45               3
        67               1

6 rows selected.

SQL> select personId,
  2         row_number() over(partition by personId order by rownum) Sequence_Number
  3  from your_table
  4  order by rownum;

  PERSONID SEQUENCE_NUMBER
---------- ---------------
        32               1
        45               1
        32               2
        67               1
        45               2
        45               3

6 rows selected.

SQL> drop table your_table;

Table dropped.

SQL>
person null    schedule 15.04.2015
comment
В этом случае вы можете просто сделать ORDER BY NULL или ORDER BY rownum - и я бы использовал ROW_NUMBER() вместо RANK(), если есть другой столбец, который OP хочет использовать для заказа. - person David Faber; 15.04.2015
comment
@DavidFaber, только order by rownum один раз, не гарантирует желаемой сортировки, OP должен выполнить этот порядок twice один в over() части, а другой в конце запроса, однако спасибо за ваш комментарий, ответ отредактирован. - person null; 15.04.2015
comment
Правильно, я предлагал ORDER BY rownum только иметь что-то в обязательном предложении ORDER BY. Я не знаю, есть ли желаемый вид со стороны OP или нет. - person David Faber; 15.04.2015
comment
я тоже Я не совсем понял сценарий OP, ваш комментарий был очень полезен, большое спасибо. - person null; 15.04.2015
comment
Спасибо за ответ! вопрос был больше связан с выполнением этого в ODI и ссылкой на временную таблицу. Я частично понял это, используя счетчик, но отказался от этого. - person DatabaseAdministrator1; 17.04.2015