如何基于报表列值在Oracle中生成运行序列

时间:2019-05-30 08:54:57

标签: sql oracle oracle-apex oracle12c

我有以下示例Oracle APEX报告,通过该示例,从origin_tab(id,origin_id,origin_name)中获取了原始ID和原始名称

基于这两个列的值,我需要动态生成“临时起源ID”值,作为从origin_tab进行选择检索的一部分。

此规则是-原始名称与原始ID相同,请在破折号前加上原始ID值,并为每个原始ID附加一个3位数字序列,如下例所示。

由于前两个记录的来源名称(AAA)相同,因此将'001'附加到来源ID 1111。对于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

对于临时起源ID,不确定要采用哪种方法来实现上述结果。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用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;

Here是db <>小提琴。

答案 1 :(得分:0)

每当名称更改时,创建一个标志列并放在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 demo