2013-12-13 2 views
1

Я использую Oracle Apex, и я оцениваю скорость звонка. Я почти получаю результаты, которые мне нужны. Единственная проблема, с которой я столкнулся, заключается в том, что когда функция рангов встречается с двойными значениями, по умолчанию им присваивается самый низкий ранг. напримерРейтинг с дубликатами

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 это работает, но кажется ненужным шагом.

Любая помощь будет оценена

+0

При ранжировании нет 1, как правило, считается самым высоким? Традиционно присуждать высший ранг привязанным ценностям в реальном мире. Вы действительно хотите, чтобы все они были 8 или 4, 5, 6, 7, 8 - назначены полуслучайно, если у вас нет возможности разбить галстук? (В том числе ваши существующие данные запроса и образца, как текст, а не изображения, как правило, были бы полезны. Изображение гораздо сложнее использовать для воссоздания вашей проблемы). –

+0

Я могу видеть, откуда вы родом, но в среде контакт-центра мы не хотим сообщать группе из 5 человек с тем же временем обработки, что человек был ранжирован выше человека b, c, d, e. Мы хотим отразить, что они равны, однако мы хотим, чтобы они имели более высокий результат. –

+1

ОК, так что не 'dense_rank' тогда, просто проверяя. Почему лучше сказать, что все они восьмые, а не все четвёртое? Просто любопытно ... –

ответ

2

Вид странным, что нужно сделать, но я хотел бы сделать что-то вроде:

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; 

Который дает вам:

 RANK CALL_SPEED 
---------- ---------- 
     1   65 
     2   72 
     3   92 
     8  102 
     8  102 
     8  102 
     8  102 
     8  102 
     9  113 
     10  154 
     11  201 
     12  352 
+0

Это прекрасно. огромное спасибо –

2

просто альтернатива , без всякой причины, за исключением, возможно, для того, чтобы избежать накладных расходов памяти (?) из числа секционированных:

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; 
Смежные вопросы