首页 > 解决方案 > 如何根据报表列值在 Oracle 中生成运行序列

问题描述

我有以下示例 Oracle APEX 报告,其中 Origin ID 和 Origin Name 是从origin_tab(id,origin_id,origin_name)

基于这两个列值,我需要动态生成 Temporary Origin ID 值,作为从origin_tab.

这背后的规则是 - 如果 Origin Name 与 Origin ID 相同,则在破折号之前取 Origin ID 值,并为每个 Orgin 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

对于 Temporary Origin ID,我应该在查询中采用什么方法来实现上述结果?

标签: sqloracleoracle-apexoracle12c

解决方案


使用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<>fiddle。


推荐阅读