我有以下示例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,不确定要采用哪种方法来实现上述结果。
任何帮助将不胜感激。
答案 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