Oracle - funcțiile rank () și dense_rank () (sau învățăm să selectăm valorile necesare în interiorul

Să începem cu funcția RANK (). Cu o explicație a ceea ce este și în ce cazuri poate fi util pentru noi.

Funcția RANK () este o funcție foarte utilă, ne permite să enumerăm un set pentru o anumită valoare de grupare în întregul set de date selectat. Cel mai simplu mod de a arăta acest lucru este prin exemplu. Pentru a face acest lucru, creați o masă mică:


Permiteți acestui tabel să conțină anumite facturi pentru diferiți utilizatori PERSON pentru diferite sume de SM la diferite durate DT.

Și acum să presupunem că vrem să primim pentru fiecare utilizator maximul pe care l-am facturat pentru tot timpul.
Acest tip de problemă face ca rezolvarea funcției RANK () să fie foarte ușoară.

Pentru a obține rezultatul dorit, trebuie să grupăm utilizatorii cu un salariu în ordine descrescătoare, după cum urmează:
Avem:


Acum, tot ce avem nevoie este doar să luăm prima înregistrare pentru fiecare utilizator în ordine, va fi o valoare maximă în el. De aceea avem nevoie de funcția RANK ().
Pentru aceasta, rescrieți interogarea noastră astfel:
Avem:


Acum avem o coloană suplimentară care numără valorile pentru suma (SM) din cadrul grupărilor pentru fiecare persoană (PERSON).

Acum, tot ce este lăsat pentru noi este să selectăm din setul recepționat acele înregistrări în care valoarea câmpului nou RNK = 1.

Obțineți setul de conturi maxime dorite pentru fiecare utilizator:


Acum, să încercăm să explicăm care este funcția DENSE_RANK () pentru noi. De fapt, aceste funcții fac același lucru, cu o excepție foarte mică, această excepție este demonstrată de exemplu. Pentru a face acest lucru, schimbăm setul original astfel încât să aibă multe valori identice ale sumei contului (SM). Iată cum:


Acum executa script-ul șarpele familiar, adăugând o altă coloană, care va enumera grupul nostru, dar numai cu DENSE_RANK () Funcția:
Obținem rezultatul:


Acum putem vedea diferența pe persoana de romane, aici este clar că RANK () funcția pentru următoarele grupe de valoare de câmp SM identic este atribuit un serial de înregistrări număr în grupuri, în timp ce DENSE_RANK funcția () este atribuit următorul număr secvențial. Această distincție poate fi util pentru noi în rezolvarea acestei probleme, în care trebuie să selectați nu prima înregistrare, și să spunem 3 sau 4, iar aici condiția aplicării unei funcții poate varia în funcție de ceea ce vrem să ajungem. Dacă vrem să obținem a treia valoare unică, atunci este mai corect să folosim DENSE_RANK (). Cu ajutorul RANK (), în acest caz putem obține numărul ordinal al șirului de valoare căutat.