Ajutați - după - sql (dml) cum să afișați în n rânduri din fiecare grup

Pentru a rezolva această problemă, trebuie să împărțiți întregul set de rânduri în grupuri, sortați după criteriul cerut (după dată sau număr de vânzări) din fiecare grup și selectați secvențial numărul necesar de rânduri, începând cu primul rând din fiecare grup.

Luați în considerare următoarea problemă:

Rezultă de la tabelul de produse trei modele cu cele mai mici numere din fiecare grup, caracterizat de tipul de produs.

Ie necesită 3 computere, 3 laptopuri și 3 imprimante, numerele cărora sunt mai mici decât numerele celorlalte modele din grupul lor. Deoarece numărul modelului este unic în tabelul Produs. atunci nu există probleme cu duplicatele. Rețineți că problema dublării nu este fundamentală, însă va fi necesară clarificarea formulării.

Soluție "clasică"

Această soluție se bazează pe algoritmul de numerotare a rândurilor returnate de interogare. Ie numărăm liniile și apoi alegem acelea care au numere mai mici decât un număr dat. În urma algoritmului menționat, interogarea, care numără întregul set de rânduri din tabel comandat prin creșterea numărului de model, poate fi scrisă după cum urmează:

Numai pentru rezolvarea problemei noastre este necesar să nu numerotăm întregul set, ci fiecare grup separat. Acest lucru este ușor de realizat dacă condiția de îmbinare a tabelelor adaugă condiția de coincidență a tipurilor de produse și se adaugă gruparea după tip:

în conformitate cu condiția problemei, limitează trei rânduri în fiecare grup. De fapt, am rezolvat deja problema. Rămâne doar să adăugăm un producător (producător), care se poate face și în moduri diferite. De exemplu, reconectați interogarea de mai sus în tabelul Produs sau utilizați subdotarea de corelare din clauza SELECT. În scopuri didactice, voi cita ambele abordări.

1. Compusul

Aici, am exclus numarul coloanei suplimentare, care a fost folosit pentru demonstratii, deoarece nu este nevoie sa trimitem numarul liniei.

2. Semnificația în clauza SELECT

Utilizarea unei subcheieri într-o clauză SELECT este permisă dacă returnează o singură valoare pentru fiecare rând al interogării principale. Această condiție este îndeplinită în țara noastră. alegem producătorul modelului care este transferat din interogarea principală și este unic (cheia primară din tabelul Produs).

Soluție bazată pe funcții de clasificare

Pentru a rezolva problema noastră, folosim funcția RANK. Această funcție vă permite să împărțiți toate rândurile returnate de interogare în grupuri și să calculați rangul fiecărui rând din grup în funcție de tipul specificat. Deoarece vom sorta după un număr de model unic, rangul va fi de fapt același cu numărul de linie din grup. Deci, soluția

De fapt, totul se face într-o subcontractare. Interogarea externă servește doar la limitarea eșantionului la trei modele pentru fiecare grup. Cu alte cuvinte, lăsăm doar acele linii pentru care rangul nu depășește trei.

Economică, nu-i așa? Cu toate acestea, să analizăm mai detaliat construcția

Clauza de tip PARTITION BY generează grupuri; într-un grup avem rânduri care au același tip de ieșire (aceeași valoare în coloana tip).

Clauza modelului ORDER BY specifică sortarea rândurilor într-un grup (prin creșterea numărului de model).

În cele din urmă, RANK () atribuie un rang fiecărui rând din grup în funcție de tipul specificat, adică prima linie din grup primeste rangul 1, urmatoarea daca are un numar excelent de model, rangul 2, etc. După cum am spus, deoarece numărul de model este unic, atunci fiecare rând din grup va avea un rang excelent. În caz contrar, liniile cu același număr de model ar avea același rang.

O descriere detaliată a funcțiilor de clasificare depășește domeniul de aplicare al acestui articol, dar probabil voi scrie ceva similar pentru SQL Tutorial.

Exerciții SELECT (etapele de rating)