T-sql, spații și intervale

Sarcina de a găsi spații și intervale în SQL foarte des trebuie rezolvată în situații reale. Principiul de bază este că aveți o anumită secvență de numere sau valori de date și de timpuri între care trebuie să se respecte un interval fix, dar unele elemente lipsesc. Rezolvarea problemei de găsire a spațiilor înseamnă găsirea elementelor care lipsesc în secvență și căutarea unor intervale - găsirea unor intervale continue de valori existente. Pentru a demonstra tehnica lacunelor de cercetare și benzi I folosesc un tabel denumit T1 cu secvență numerică în col1 coloană cu o spațiere egală cu unu, iar masa T2 cu o secvență de data și ora metodei din coloana col1 cu un interval de o zi. Aici este codul pentru crearea T1 și T2 și completarea lor cu date de testare:







Așa cum am menționat mai înainte, sarcina de a găsi spații înseamnă să găsești într-o secvență valori ale valorilor lipsă. Pentru datele noastre de testare, rezultatul necesar pentru secvența numerică din T1 este:

T-sql, spații și intervale

Dar rezultatul dorit pentru secvența etichetelor de dată și oră din T2:

T-sql, spații și intervale






Problema găsirii intervalelor implică detectarea intervalelor de valori existente. Iată rezultatul așteptat pentru o secvență numerică:

T-sql, spații și intervale

Dar rezultatul necesar pentru secvența de timp a datelor:

T-sql, spații și intervale

Una dintre cele mai eficiente soluții la problema găsirii intervalelor este de a folosi clasamentul. Funcția DENSE_RANK este utilizată pentru a crea o secvență de numere întregi în comanda col1, iar diferența dintre col1 și "rank dense" (drnk) este calculată, aproximativ;

T-sql, spații și intervale

Rețineți că în intervalul de diferență este același, și este unic pentru fiecare interval. Acest lucru se datorează faptului că col1 și drnk cresc cu un interval. Când se trece la intervalul următor, col1 crește cu mai mult de un interval, iar drnk crește întotdeauna cu un interval. Prin urmare, diferența fiecărui interval ulterior este mai mare decât cea precedentă. Datorită faptului că această diferență este aceeași și unică în cadrul fiecărui interval, o puteți utiliza ca identificator de grup. Așadar rămâne doar gruparea rândurilor prin această diferență și returnarea valorii maxime și minime a col1 în fiecare grup:

Planul pentru această soluție este prezentat în figură:

Planul este foarte eficient, deoarece atunci când se calculează rangul dens, se folosește ordonarea indexului bazat pe col1.







Articole similare

Trimiteți-le prietenilor: