Numerotarea rândurilor în funcție de ordinea specificată de valorile cheii primare

Firește, liniile trebuie să fie numerotate conform unei anumite ordini. Lăsați această comandă să fie specificată de coloana cheii primare, adică în ordinea crescândă (sau descrescătoare) a valorilor din această singură coloană. Pentru certitudine, să presupunem că trebuie să renumerotăm modelele în tabelul Produs, unde numărul modelului este doar cheia primară. Este esențial că valorile cheii primare nu conțin duplicate și valori NULL, rezultând o posibilitate principală de a stabili o corespondență unică între numărul modelului și numărul liniei din ordinea dată de sortare a modelelor.

Luați în considerare mai întâi următoarea interogare:

SELECT P1.model, P2.model

DE PRODUS P1 JOIN

Produs P2 pe P1.model <= P2.model

Aici conectăm două mese identice prin inegalitatea P1.model <= P2.model, в результате чего каждая модель из второй таблицы (P2.model) будет соединяться только с теми моделями из первой таблицы (P1.model), номера которых меньше или равны номеру этой модели. В результате получим, например, что модель с минимальным номером (1121) будет присутствовать во втором столбце результирующего набора только один раз, так как она меньше или равна только самой себе. На другом конце будет находиться модель с максимальным номером, так как любая модель будет меньше или равна ей. Следовательно, модель с максимальным номером будет сочетаться с каждой моделью, и число таких сочетаний будет равно общему числу моделей в таблице Product.

Din ceea ce sa spus mai sus, este clar că acest număr de câte ori apare fiecare dintre modele în a doua coloană a setului de rezultate va fi exact numărul modelului atunci când sortați modelele în ordine crescătoare.

Astfel, pentru a rezolva problema noastră de numerotare, este suficient să recalculați modelele din coloana din dreapta, ceea ce nu este greu de făcut prin gruparea și utilizarea funcției agregate COUNT:

SELECT COUNT (*) nu, P2.model

DE PRODUS P1 JOIN

Produs P2 pe P1.model <= P2.model

GROUP BY P2.model

Pentru numerotare în ordine inversă, este suficient ca semnul inegalității să fie schimbat la cel opus.

Dacă sistemul dvs. DBMS suportă funcții de clasificare. atunci este destul de ușor să numere liniile:

SELECTAREA ROW_NUMBER () OVER (ORDER BY BY model) nu, model

Funcția numărului de ordine

Funcția ROW_NUMBER, așa cum sugerează și numele, enumeră rândurile returnate de interogare. Cu ajutorul acestuia puteți executa ordonarea mai complexă a rândurilor în raport decât cea dată de clauza ORDER BY în cadrul standardului SQL-92.

Înainte de apariția acestei funcții, numerotarea rândurilor returnate de interogare a trebuit să utilizeze un algoritm destul de complex, intuitiv, nu clar. Singurul avantaj al acestui algoritm este că va funcționa pe aproape toate bazele de date care suportă standardul SQL-92.

Folosind funcția ROW_NUMBER, puteți:

Specificați o numerotare care va diferi de ordinea de sortare a rândurilor setului de rezultate;

creați o numerotare "orb", adică selectați grupuri dintr-un set comun de rânduri și numărați-le individual pentru fiecare grup;

utilizați mai multe metode de numerotare neintenționat, deoarece, de fapt, numerotarea nu depinde de sortarea șirurilor de interogare.

Cea mai ușoară modalitate de a arăta funcționalitatea funcției ROW_NUMBER este prin exemple simple, la care ne îndreptăm.

Exemplul 1: Enumerați toate zborurile din tabelul Trip în ordinea ascendentă a numerelor lor. Sortați după.

SELECT numărul rând () peste (ORDER BY trip_no) num,

WHERE ID_comp <3

ORDER BY id_comp, trip_no

Clauza OVER, cu care este utilizată funcția ROW_NUMBER, specifică ordinea numerotării rândurilor. În acest caz, se utilizează o clauză suplimentară ORDER BY, care nu are nicio legătură cu ordinea ieșirii șirurilor de interogare

Și dacă doriți să numerotați zboruri pentru fiecare companie separat? Pentru aceasta avem nevoie de încă o construcție în clauza OVER - PARTITION BY.

Clauza PARTITION BY specifică grupurile de șiruri pentru care este efectuată numerotarea independentă. Grupul este determinat de egalitatea valorilor din lista coloanelor enumerate în acest desen, pentru rândurile care alcătuiesc grupul.

Exemplul 2: Numără zborurile fiecărei companii separat în ordinea ascendentă a numerelor de zbor.

SELECT numărul de rând () peste (partiția BY id_comp ORDER BY id_comp, trip_no) num,

WHERE ID_comp <3

ORDER BY id_comp, trip_no

PARTIDUL prin id_comp înseamnă că zborurile fiecărei companii formează un grup pentru care se efectuează o numerotare independentă.

Absența unei clauze PARTITION BY, ca în primul exemplu, înseamnă că toate rândurile setului de rezultate formează un singur grup.

Pentru a continua descărcarea, trebuie să colectați imaginea: