【问题标题】:How to produce a running sequence in Oracle based on report column values如何根据报表列值在 Oracle 中生成运行序列
【发布时间】:2019-10-15 21:49:28
【问题描述】:

我有以下示例 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,我应该在查询中采用什么方法来实现上述结果?

【问题讨论】:

    标签: sql oracle oracle-apex oracle12c


    【解决方案1】:

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

    【讨论】:

      【解决方案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 是一个 dbfiddle。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        相关资源
        最近更新 更多