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