dense_RANK() 函数,我该如何修复?甲骨文

dense_RANK() function, how can I fix? oracle

我现在的代码是这样的

select c.id_number
      ,dense_RANK() OVER (Partition by c.id_number ORDER BY c.id_number) "rank"
from  children c

现在是这样

id_Number ___ rank
001           1
002           1
003           1
003           1
004           1
004           1
004           1

但我想这样展示,

id_Number ___ rank
001           1
002           1
003           1
003           2
004           1
004           2
004           3

我这样试试

 select c.id_number
          ,RANK() OVER (Partition by c.id_number ORDER BY c.id_number) "rank"
 from  children c

但它没有达到我想要的效果,

像我想要的那样编​​码的最佳方法是什么

我想你想要 row_number():

select c.id_number,
       row_number() over (Partition by c.id_number ORDER BY c.id_number) as "rank"
from  children c;

Dense_Rank 将分配一个等级编号。在相等的情况下,它将为所有相等的行分配相同的数字,然后移动到下一个数字(这就是 "dense" 的来源)。在您的示例中,003 是其分区中的第一个,因此它将具有 1 的等级。下一个 003 将不是其分区中的第一个,但与前一个相同,它将具有相同的等级 1。这就是为什么您的解决方案不起作用的原因。

如果您希望它起作用,只需使用 row_number 即可。这个只关心顺序,而不关心该行与其他行的关系。

    select c.id_number
        ,row_number() OVER (Partition by c.id_number ORDER BY c.id_number) "rank"
    from  children c