oracle 为每个ID分配行号,其中某些值始终具有固定编号

ve7v8dk2  于 2023-02-15  发布在  Oracle
关注(0)|答案(1)|浏览(174)

我想创建一个查询,该查询为数据库表中的每个ID分配行号,并且某些特定值始终获得固定行号。例如,如果col2中的值为A,则行号应始终设置为1。同样,如果col2包含值B,则行号应始终为2col2中的所有其他值应从3开始按连续顺序分配行号。
预期结果:

myid    col1    col2    row_number
----------------------------------
1       foo     A       1
1       bar     B       2
1       foobar  C       3
1       foobar  D       4   
2       foobar  A       1
2       foob    X       3
3       hello   B       2
3       hello   Z       3
3       hi      Y       4

Here就是一个无法正常工作的示例。

o8x7eapl

o8x7eapl1#

听起来像是要以特定的偏移量开始row_number,忽略常量值并为它们分配一个常量行号。
你可以做一些有点丑陋的事情,像这样:

SELECT myid, col1, col2,
        case
          when col2 = 'A' then 1
          when col2 = 'B' then 2
         else row_number() over (partition by myid
                                 order by case when col2 = 'A' then 'ZZZ'
                                               when col2 = 'B' then 'ZZZ1'
                                               else col2
                                           end)  + 2
       end as row_number   
FROM  newtable
ORDER BY myid, row_number

结果:

MYID    COL1    COL2    ROW_NUMBER
1        foo     A           1
1        bar     B           2
1        foobar  C           3
1        foobar  D           4
2        foobar  A           1
2        foob    X           3
3        hello   B           2
3        hello   Y           3
3        hello   Z           4

行号从+2开始(取决于常数值[A,B]的数量),为每个常数值提供一个值,该值将在row_number窗口函数中排在最后,因此其余值将排在最前面。

相关问题