Oracle 重复排序

Oracle 重复排序,oracle,Oracle,我正在使用Oracle Apex,并对通话速度进行排名。我几乎得到了我想要的结果。我所面临的唯一问题是,当rank函数遇到重复值时,默认情况下,它们都会被分配最低的秩。e、 g Rank Call Speed 1 65 2 72 3 92 4 102 4 102 4 102 4 102 4 102 9

我正在使用Oracle Apex,并对通话速度进行排名。我几乎得到了我想要的结果。我所面临的唯一问题是,当rank函数遇到重复值时,默认情况下,它们都会被分配最低的秩。e、 g

Rank  Call Speed
1             65
2             72
3             92
4            102
4            102
4            102
4            102
4            102
9            113
10           154
11           201
12           352
4代表8是复制品的最高等级吗

一种方法是使用排名降序,然后从最高排名+1中减去。这是可行的,但似乎是不必要的步骤


任何帮助都将不胜感激

这是一件奇怪的事情,但我会这样做:

with data as (
    select 65 call_speed from dual union all
    select 72 call_speed from dual union all
    select 92 call_speed from dual union all
    select 102 call_speed from dual connect by level <= 5 union all
    select 113 call_speed from dual union all
    select 154 call_speed from dual union all
    select 201 call_speed from dual union all
    select 352 call_speed from dual
)
select
    rank() over (order by call_speed) + count(*) over (partition by call_speed) - 1 rank,
    call_speed
from data;

这是一件很奇怪的事情,但我会做如下事情:

with data as (
    select 65 call_speed from dual union all
    select 72 call_speed from dual union all
    select 92 call_speed from dual union all
    select 102 call_speed from dual connect by level <= 5 union all
    select 113 call_speed from dual union all
    select 154 call_speed from dual union all
    select 201 call_speed from dual union all
    select 352 call_speed from dual
)
select
    rank() over (order by call_speed) + count(*) over (partition by call_speed) - 1 rank,
    call_speed
from data;

这只是一个替代方案,完全没有理由,除了可能避免执行分区计数时的内存开销:

with data as (
    select 65 call_speed from dual union all
    select 72 call_speed from dual union all
    select 92 call_speed from dual union all
    select 102 call_speed from dual connect by level <= 5 union all
    select 113 call_speed from dual union all
    select 154 call_speed from dual union all
    select 201 call_speed from dual union all
    select 352 call_speed from dual
)
select
    count(*) over () + 1 - rank() over (order by call_speed desc) rank,
    call_speed
from data
order by call_speed;

这只是一个替代方案,完全没有理由,除了可能避免执行分区计数时的内存开销:

with data as (
    select 65 call_speed from dual union all
    select 72 call_speed from dual union all
    select 92 call_speed from dual union all
    select 102 call_speed from dual connect by level <= 5 union all
    select 113 call_speed from dual union all
    select 154 call_speed from dual union all
    select 201 call_speed from dual union all
    select 352 call_speed from dual
)
select
    count(*) over () + 1 - rank() over (order by call_speed desc) rank,
    call_speed
from data
order by call_speed;

什么时候排名1不被认为是最高的?在现实世界中,传统的做法是将较高的等级授予捆绑价值观。你真的希望他们都是8,还是4,5,6,7,8,如果你没有办法打破平局的话,他们是半随机分配的?将现有查询和示例数据作为文本而不是图像包含通常会有所帮助。图像更难用于重现您的问题。我可以看到您来自何方,但在呼叫中心环境中,我们不想告诉一组5人,他们处理时间相同,a的排名高于b、c、d、e。我们想反映出他们是平等的,但是我们希望他们有更高的结果。好吧,那么就不要排高,只是检查一下。为什么说他们都是第八名而不是第四名更好?只是好奇…排名4意味着只有3个人比你快。当排名1不是一般认为最高吗?在现实世界中,传统的做法是将较高的等级授予捆绑价值观。你真的希望他们都是8,还是4,5,6,7,8,如果你没有办法打破平局的话,他们是半随机分配的?将现有查询和示例数据作为文本而不是图像包含通常会有所帮助。图像更难用于重现您的问题。我可以看到您来自何方,但在呼叫中心环境中,我们不想告诉一组5人,他们处理时间相同,a的排名高于b、c、d、e。我们想反映出他们是平等的,但是我们希望他们有更高的结果。好吧,那么就不要排高,只是检查一下。为什么说他们都是第八名而不是第四名更好?只是好奇…排名4意味着只有3个人比你快。这太完美了。非常感谢你这太完美了。多谢各位