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
我现在的代码是这样的
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