代码之家  ›  专栏  ›  技术社区  ›  stack0114106

Oracle-window函数中没有分区,但为acd属性填充序列号

  •  0
  • stack0114106  · 技术社区  · 6 年前

    我有ACD属性表,有3列——ID、ACD和RPT。当第一次为ACD属性报告RPT时,将其设置为1,但如果任何后续ACD属性重复,则将其设置为0。ID列始终递增(排序为pk)。对于连续零,我需要从2,3开始的序列号…如所需列所示。

    id  acd  rpt wanted
    1   a    1    1
    2   b    1    1
    3   b    0    2
    4   a    1    1
    5   a    0    2
    6   a    0    3
    7   d    1    1
    8   d    0    2
    9   d    0    3
    10  c    1    1
    11  c    0    2
    12  c    0    3
    13  c    0    4
    14  c    0    5
    15  d    1    1
    16  a    1    1
    

    我尝试了window函数,但是当我在partition子句中使用“value”列时,它将不需要的所有a进行分组。如果RPT和ID递增,是否可以在“所需”列中获得结果?

    2 回复  |  直到 6 年前
        1
  •  1
  •   dnoeth    6 年前

    您需要嵌套的OLAP功能:

    SELECT dt.*,
       Row_Number() Over (PARTITION BY grp ORDER BY id)
    FROM
     ( -- calculate a group number using a Cumulative Sum over 0/1 (for partitioning in next step)
       SELECT prop.*, Sum(rpt) Over (ORDER BY id ROWS Unbounded Preceding) AS grp
       FROM prop
     ) dt
    
        2
  •  3
  •   Gordon Linoff    6 年前

    什么时候? rpt = 1 然后你想要 1 . 那么你想要 0 为每个枚举的 acd . 如果这是正确的,那么逻辑是:

    select t.*,
           (case when rpt = 1 then 1
                 else 1 + row_number() over (partition by acd, rpt order by id)
            end) as wanted
    from t;