0

我的代码现在是这样的

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

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

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

4

2 回答 2

3

我想你想要row_number()

select c.id_number,
       row_number() over (Partition by c.id_number ORDER BY c.id_number) as "rank"
from  children c;
于 2016-05-18T14:04:35.307 回答
0

Dense_Rank 将分配一个等级编号。在相等的情况下,它将为所有相等的行分配相同的数字,然后移动到下一个数字(这就是“密集”的来源)。在您的示例中,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
于 2016-05-18T14:16:17.500 回答