sql - 如何根据报表列值在 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,我应该在查询中采用什么方法来实现上述结果?
解决方案
使用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。
推荐阅读
- typescript - 找不到 TypeScript before() 和 after()
- javascript - 在 Redux Reducer 中保存 API 响应/数据
- javascript - 如何删除 v-for 数组中的重复值?
- go - 为什么 mqtt 客户端使用唯一的 clientId 重新连接代理?
- python - python jsonschema在列表项上使用模式不起作用
- c# - 在 C# 的抽象类中的具体方法中调用抽象方法
- python - SQLITE3,逐行请求/更新
- c++ - boost-beast 中的异常
- python - 子进程命令执行
- typescript - Vue 你可能需要一个额外的加载器来处理这些加载器的结果