2015-11-23 2 views
1

Мое (ограниченное) понимание функции Rank() заключается в том, что если n строк соответствуют критериям раздела, на основе упорядочения, первый набор несоответствующих строк получает ранг 1, затем набор из 1 добавляется для следующего ранга строк. Как он переходит к ранге 2? В следующем наборе данных у меня есть 3 строки ранга 9 (3 сопоставимые строки), а следующий рейтинг равен 12 (9 + 3 = 12), который затем имеет 2 строки из 12 (две соответствующие строки ранга 12) и следующий ранг тогда 14. Я не понимаю строки ранга 1 и 2. Каков процесс увеличения рядов этих строк?Oracle pl/sql - как оценивает функция Rank()

Вот мой исходный код

select Pos_ID, work_city, organization 
RANK() OVER (PARTITION BY work_city ORDER BY organization) rnk 
from DDTMS.POSITIONS 
where pos_ID < 14800 order by rnk; 

и здесь есть (частично) результат набора данных (я добавил периоды, чтобы держать его несколько отформатированы для более удобного просмотра - первая строка строка заголовка)

POS_ID WORK_CITY___________ ORGANIZATION________ RNK 
14741 QUANTICO............ HQ US MARINE CORPS.. 1 
14765 REDSTONE ARSENAL.... US ARMY AVN & MISSLE 1 
14769 SAN DIEGO........... SPACE & NAVAL WARFAR 1 
14776 THE HAGUE........... USD(COMPTROLLER).... 1 
14790 VICKSBURG........... U S ARMY ENGR RESEAR 1 
14732 WARREN.............. US ARMY TANK-AUTOMOT 1 
14777 WASHINGTON.......... HQUSACE MILITARY PRO 1 
14774 WASHINGTON NAVY YARD COMMANDER, NAVAL INS 1 
14771 WRIGHT PATTERSON AFB AF AUDIT AGENCY..... 1 
14749 EGLIN AFB........... AIR ARMAMENT........ 2 
14764 WRIGHT PATTERSON AFB AF MUSEUM........... 2 
14789 ARLINGTON........... AS(LOGISTICS & MATER 2 
14783 ABERDEEN PROV GRND.. USA EDGEWOOD CHEM AN 2 
14779 FORT BELVOIR........ DLA LOGISTICS OPERAT 2 
14735 WASHINGTON.......... NAVSEA HQ FIELD SUPP 2 
14733 PENTAGON, ARLINGTON. IMMEDIATE OFC OF CHI 2 
14738 PENTAGON, ARLINGTON. IMMEDIATE OFC OF CHI 2 
14762 FORT MEADE.......... DISA, GIG OPERATIONS 2 
14739 WASHINGTON NAVY YARD PEO FOR SUBMARIN.... 2 
14737 ARLINGTON........... ASD(ASIAN & PACIFIC. 3 
14775 ABERDEEN PROV GRND.. USA HQ COMM ELECT CM 3 
14731 FORT BELVOIR........ OFC OF THE CHIEF OF. 3 
14729 ARLINGTON........... DEFENSE SECURITY COO 4 
14745 ARLINGTON........... DIR, COST ASSESSMENT 5 
14736 ARLINGTON........... HQDA, ODCSLOG....... 6 
14788 ARLINGTON........... HQDA, OSA, OFC OF TH 7 
14760 ARLINGTON........... OASD (HOMELAND DEF & 8 
14740 ARLINGTON........... OASD (SO/LIC & INTER 9 
14773 ARLINGTON........... OASD (SO/LIC & INTER 9 
14743 ARLINGTON........... OASD (SO/LIC & INTER 9 
14750 ARLINGTON........... OASD(ISA)........... 12 
14751 ARLINGTON........... OASD(ISA)........... 12 
14778 ARLINGTON........... OFC ASST SECY OF ARM 14 
14746 ARLINGTON........... OFC DIR, ADMIN/MGMT. 15 
14753 ARLINGTON........... OFC GEN COUNSEL..... 16 
14734 ARLINGTON........... OFC SEC OF DEF...... 17 
14768 ARLINGTON........... OFFICE OF NAVAL RESE 18 
14781 ARLINGTON........... ONI................. 19 
14757 ARLINGTON........... U S AIR FORCE....... 20 
14763 ARLINGTON........... U S AIR FORCE HQ.... 21 
+0

я оставил из псевдоним Rnk и заказ на внешней части запроса. Просто обновил это. –

+0

То, что я думаю о 'RANK()', состоит в том, что оно возвращает количество записей, которые были раньше/меньше текущей записи, плюс 1. Таким образом, rank = 1 означает, что есть нулевые записи, ранее или меньше, чем текущая запись; rank = 2 означает, что существует ровно 1 запись раньше/меньше текущей записи; ранг 12 означает, что есть 11 записей ранее/меньше, чем текущая запись. –

ответ

0

Оценка не зависит от каждого раздела. Поэтому каждый раздел будет иметь ранг одного. Перегородки с не менее чем двумя строками и ничьей в первом ранге будут иметь ранг два.

Это может быть яснее, если вы заказывали результаты в соответствии с секционирования и упорядочение функции ранга:

select Pos_ID, work_city, organization 
RANK() OVER (PARTITION BY work_city ORDER BY organization) 
from DDTMS.POSITIONS 
where pos_ID < 14800 
order by work_city, organization; 
Смежные вопросы