Как создать работающую последовательность в Oracle на основе значений столбца отчета - PullRequest
0 голосов
/ 30 мая 2019

У меня есть следующий пример отчета Oracle APEX, в котором идентификатор источника и имя источника извлекаются из origin_tab(id,origin_id,origin_name)

На основе этих двух значений столбцов мне нужно сгенерировать значение временного идентификатора источника на лету как часть извлечения выборки из origin_tab.

Правило, лежащее в основе этого, - когда имя источника совпадает с идентификатором источника, возьмите значение идентификатора источника перед тире и добавьте трехзначную последовательность для каждого идентификатора оригинала, как показано в примере ниже.

Поскольку имя источника (AAA) одинаково для первых двух записей, к идентификатору источника 1111 добавляется '001'. То же самое для BBB, к этим трем записям добавляется «002» и т. Д.

Обратите внимание, что Temporary Origin ID здесь представляет собой строку.

Origin ID         Origin Name        Temporary Origin ID
----------------- ------------------ --------------------
1111-1            AAA                1111001
1111-2            AAA                1111001
1111-3            BBB                1111002
1111-4            BBB                1111002
1111-5            BBB                1111002
1111-6            CCC                1111003
1111-7            DDD                1111004
1111-8            DDD                1111004

Какой подход я должен использовать в своем запросе для достижения вышеуказанного результата для идентификатора временного происхождения?

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Использование dense_rank():

select t.*,
       (substr(origin_id, 1, 4) ||
        lpad(dense_rank() over (order by origin_name), 4, '0')
       ) as temp_origin_id
from t;

Здесь - это дБ <> скрипка.

0 голосов
/ 30 мая 2019

Создайте столбец с флагами и добавляйте туда 1 каждый раз, когда имя меняется.Вы можете обнаружить это, используя lag() или подзапрос.Затем объедините аналитическую сумму столбца флага с 1111.

select Origin_ID, Origin_Name, 
       '1111'||lpad(sum(flag) over (order by origin_id), 3, '0') Temp_Origin_ID
  from (
    select t.*, 
           case lag(origin_name) over (order by origin_id) when origin_name then 0 else 1 end flag 
      from t)
  order by Origin_ID

Демо-версия dbfiddle

...