繁体   English   中英

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

[英]How to produce a running sequence in Oracle based on report column values

我有以下示例Oracle APEX报告,通过该报告,可以从origin_tab(id,origin_id,origin_name)中检索Origin ID和Origin Name。

基于这两个列值,我需要动态生成Temporary Origin ID值,作为从origin_tab中进行选择检索的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,我应该采用哪种方法来获得上述结果?

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

是db <>小提琴。

制作一个标志列,并在每次名称更改时在其中放置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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM