Clauza SQL OVER () – când și de ce este utilă?

Deci, în cuvinte simple: clauza Over poate fi utilizată pentru a selecta valori neagregate împreună cu cele agregate.

Partiția BY, ORDER BY în interior și ROWS sau RANGE fac parte din clauza OVER () by.

partiția by este utilizată pentru partiționarea datelor și apoi pentru a efectua aceste ferestre, funcții agregate și dacă nu „t are partiție cu întregul set de rezultate de atunci este considerat ca o singură partiție.

Să vedem sintaxa de bază a clauzei OVER

PARTITION BY: Se utilizează pentru partiționarea datelor și efectuarea operațiunilor pe grupuri cu aceleași date.

ORDER BY: Se utilizează pentru a defini ordinea logică a datelor din partiții. Când nu specificăm partiția, întregul set de rezultate este considerat o singură partiție

: Aceasta poate fi utilizată pentru a specifica ce rânduri ar trebui să fie luate în considerare într-o partiție atunci când efectuați operația.

Să luăm un exemplu:

Iată setul meu de date:

Deci, permiteți-mi să execut diferite scenarii și să văd cum sunt afectate datele și voi veni de la sintaxa dificilă la simplă one

Doar respectați partea sum_sal. Aici folosesc comanda în funcție de salariu și folosesc „GAMA ÎNTRE PRECEDERI ȘI RÂNDUL ACTUAL NELIMITAT”. În acest caz, nu folosim partiția, astfel încât datele complete vor fi tratate ca una partiție și ordonăm salariul. Și cel mai important lucru aici este PRECEDEREA ȘI RÂNDUL ACTUAL NELIMITAT. Aceasta înseamnă că atunci când calculăm suma, de la rândul inițial la rândul curent pentru fiecare rând. Dar dacă vedem rânduri cu salariul 5000 și numele = „Pavan”, în mod ideal ar trebui să fie 17000 și pentru salariu = 5000 și nume = Mark, ar trebui să fie 22000. Dar, așa cum folosim RANGE și, în acest caz, dacă găsește orice s elemente similare, apoi le consideră ca fiind același grup logic și le efectuează o operație și atribuie valoare fiecărui element din acel grup. Acesta este motivul pentru care avem aceeași valoare pentru salariu = 5000. Motorul a crescut la salariu = 5000 și Nume = Ron și suma calculată și apoi a atribuit-o la tot salariul = 5000.

Deci, cu RÂNDURI ÎNTRE PRECEDERE NELIMITATE ȘI RÂND ACTUAL Diferența este pentru articolele de aceeași valoare în loc de grupându-le împreună, calculează SUM de la rândul inițial la rândul curent și nu tratează diferit articolele cu aceeași valoare ca RANGE

Aceste rezultate sunt aceleași ca

Acest lucru se datorează faptului că Peste (comandă după salariu) este doar o reducere scurtă a Peste (comandă după salariu GAMA ÎNTRE PRECEDEREA NELIMITATĂ ȘI RÂNDUL ACTUAL) Deci, oriunde specificăm pur și simplu Comanda prin fără RÂNDURI sau GAMĂ RANGE ÎNTRE NEDECLINAȚI ȘI RÂND ACTUAL ca implicit.

Notă: Acest lucru este aplicabil numai funcțiilor care acceptă RANGE / ROW. De exemplu, ROW_NUMBER și puțini alții nu acceptă RANGE / ROW și, în acest caz, , acest lucru nu intră în imagine.

Până acum am văzut că clauza Over cu o comandă ia Range / ROWS și sintaxa pare ceva așa se situează GAMA ÎNTRE PRECEDEREA NELIMITATĂ ȘI RÂNDUL ACTUAL Și se calculează de fapt până la rândul curent din primul rând. Dar dacă dorește să calculeze valorile pentru întreaga partiție de date și să le aibă pentru fiecare coloană (adică de la primul rând până la ultimul rând). Iată interogarea pentru asta

În loc de RUN CURENT, specific URMĂRUL NELIMITAT care instruiește motorul să calculeze până la ultima înregistrare a partiției pentru fiecare rând.

Acum vin la dvs. indicați ce este OVER () cu acolade goale?

Este doar o scurtătură pentru Peste (comandați după salariu RÂNDURI ÎNTRE PRECEDERI NELIMITAȚI ȘI URMĂRI NELIMITAȚI)

Aici specificăm indirect să tratez toate rezultatele mele ca pe o singură partiție și apoi să fac calcule de la prima înregistrare la ultima înregistrare a fiecărei partiții.

Am creat un videoclip despre asta și dacă sunteți interesat, îl puteți vizita. https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

Mulțumesc, Pavan Kumar AryasomayajuluHTTP: //xyzcoder.github.io

Write a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *