SELECT – OVER záradék (Transact-SQL)
- 2017.11.11.
- 17 perc olvasás
-
- V
- L
- c
- j
- M
-
+11
A következőre vonatkozik: SQL Server (minden Támogatott verziók) div id = “19fbb4c644”> Párhuzamos adattárház
Meghatározza a sorok felosztását és sorrendjét, mielőtt a társított ablak funkciót alkalmaznák. Vagyis az OVER záradék egy ablakot vagy egy felhasználó által megadott sorkészletet határoz meg a lekérdezés eredményhalmazán belül. Ezután egy ablakfüggvény kiszámítja az ablak minden sorának értékét. Az OVER záradékot a függvényekkel olyan összesített értékek kiszámításához használhatja, mint mozgó átlagok, összesített összesítők, futó összesítések vagy csoportonként a felső N.
-
Rangsorolási függvények
-
Összesítő függvények
-
Analitikus függvények
-
A NEXT VALUE FOR függvény
Transact-SQL szintaxis konvenciók
Szintaxis
Megjegyzés
Az SQL Server 2014 és korábbi verzióinak Transact-SQL szintaxisának megtekintéséhez lásd a Korábbi verziók dokumentációját.
Argumentumok
Az ablakfunkciók OVER
záradékában a következő argumentumok lehetnek:
- PARTITION BY, amely partíciókra osztja a lekérdezés eredményhalmazát.
- ORDER BY, amely meghatározza a sorok logikai sorrendjét az eredménykészlet minden partícióján belül.
- ROWS / RANGE, amely korlátozza a partíció sorait a partíción belüli kezdő és végpont megadásával. Ehhez
ORDER BY
argumentum szükséges, és az alapértelmezett érték a partíció kezdetétől az aktuális elemig terjed, ha aORDER BY
argumentum meg van adva.
Ha nem ad meg argumentumot, akkor az ablakfüggvények a teljes eredményhalmazon lesznek alkalmazva.
object_id | min | max |
---|---|---|
3 | 3 | 2139154666 |
5 | 3 | 2139154666 |
… | … | … |
2123154609 | 3 | 2139154666 |
2139154666 | 3 | 2139154666 |
PARTITION BY
A lekérdezés eredményhalmazát partíciókra osztja. Az ablakfüggvényt minden partícióra külön alkalmazzák, és a számítás újraindul minden partíciónál ion.
Ha a PARTITION BY nincs megadva, a függvény a lekérdezés eredményhalmazának minden sorát egyetlen partícióként kezeli. A függvény minden sorban alkalmazásra kerül. a partícióban, ha nem adja meg a ORDER BY
záradékot.
PARTITION BY value_expression
Megadja az oszlopot, amelyen a sor fel van osztva. Az érték_kifejezés csak a FROM záradék által elérhető oszlopokra vonatkozhat. Az érték_kifejezés nem hivatkozhat kifejezésekre vagy álnevekre a kiválasztási listában. Az érték_kifejezés lehet oszlopkifejezés, skaláris részlekérdezés, skalárfüggvény vagy a felhasználó által definiált változó.
RENDELÉS:
Meghatározza a sorok logikai sorrendjét az eredményhalmaz minden partícióján belül. Vagyis megadja az ablakfüggvény számításának logikai sorrendjét.
- Ha nincs megadva, akkor az alapértelmezett sorrend
ASC
és Az ablak függvény az összes sort a partícióban fogja használni. - Ha meg van adva, és nincs megadva ROWS / RANGE, akkor az alapértelmezett
RANGE UNBOUNDED PRECEDING AND CURRENT ROW
értéket használja az ablakhoz keret azokkal a függvényekkel, amelyek elfogadják az opcionális ROWS / RANGE specifikációt (példáulmin
vagymax
).
order_by_expression
Megad egy oszlopot vagy kifejezést, amelyen rendezni kell. a order_by_expression csak a FROM záradék által elérhető oszlopokra vonatkozhat. Az oszlop nevét vagy álnevét nem lehet egész számmal megadni.
COLLATE collation_name
Megadja, hogy az ORDER BY műveletet a collation_name mezőben megadott rendezés szerint kell végrehajtani. a collation_name lehet egy Windows rendezés neve vagy egy SQL összeállítás neve. További információkért lásd: Összevetés és Unicode támogatás. A COLLATE csak a char, varchar, nchar és nvarchar típusú oszlopokra alkalmazható.
ASC | DESC
Megadja, hogy a megadott oszlopban szereplő értékeket növekvő vagy csökkenő sorrendben kell rendezni. Az ASC az alapértelmezett rendezési sorrend.Az üres értékeket a lehető legalacsonyabb értékként kezeljük.
ROWS vagy RANGE
Érvényes: SQL Server 2012 (11.x) és újabb verziók.
További korlátozások a partíción belüli sorokat a partíción belüli kezdő és végpont megadásával. Ez úgy történik, hogy sorokat határoz meg az aktuális sorhoz képest logikai asszociációval vagy fizikai asszociációval. A fizikai társítás a ROWS záradék használatával érhető el.
A ROWS záradék korlátozza a partíció sorait azáltal, hogy rögzített számú sort ad meg az aktuális sor előtt vagy után. Alternatív megoldásként a RANGE záradék logikusan korlátozza a partíció sorait azáltal, hogy értéktartományt határoz meg az aktuális sor értékéhez képest. Az előző és a következő sorokat az ORDER BY záradék sorrendje alapján határozzuk meg. A “RANGE … CURRENT ROW …” ablakkeret tartalmazza azokat a sorokat, amelyek az ORDER BY kifejezésben ugyanazokkal az értékekkel rendelkeznek, mint az aktuális sor. Például a 2. ELŐZŐ ÉS A JELENLEGI SOR KÖZÖTTI SOROK azt jelenti, hogy a funkciók által működtetett sorok ablaka három sor méretű, kezdve 2 sorral, amelyek megelőzik az aktuális sort és azt is beleértve.
Megjegyzés
A ROWS vagy a RANGE megköveteli az ORDER BY záradék megadását. Ha a ORDER BY több sorrendű kifejezést tartalmaz, a CURRENT ROW FOR RANGE figyelembe veszi az ORDER BY lista összes oszlopát az aktuális sor meghatározásakor.
UNBOUNDED PRECEDING
Érvényes: SQL Server 2012 (11.x) és újabb.
Megadja, hogy az ablak a partíció első sorától induljon. A KÖRNYEZETT ELŐZMÉNY csak ablak kezdőpontként határozható meg.
< aláíratlan érték specifikáció > ELŐZETES
Megadva < aláíratlan érték specifikációval > az aktuális sort megelőző sorok vagy értékek számának jelzésére. Ez a specifikáció nem engedélyezett a RANGE számára.
AKTUÁLIS SOR
Az alábbiakra vonatkozik: SQL Server 2012 (11.x) és újabb verziók.
Megadja, hogy az ablak elinduljon vagy az aktuális sorban végződik, ha ROWS-szal használja, vagy az aktuális értékkel, ha a RANGE-vel együtt használja. A CURRENT ROW kezdő és befejező pontként is megadható.
ÉS
Érvényes: SQL Server 2012 (11.x) és újabb verziók.
A ROWS vagy a RANGE elemekkel együtt használható az ablak alsó (kezdő) és felső (végső) határpontjának megadásához. < ablakkeret kötött > meghatározza a határ kezdőpontját, és < ablakkeret kötött > határozza meg a határ végpontját. A felső határ nem lehet kisebb, mint az alsó határ.
UNBOUNDED FOLLOWING
Érvényes: SQL Server 2012 (11.x) és újabb verziók.
Megadja, hogy az ablak a partíció utolsó sorában ér véget. A KÖRNYEZETT FOLLOWING csak ablak végpontként határozható meg. Például a JELENLEGES SOR KÖZÖTT ÉS A FELTÉTELT KÖVETKEZÉS ALAPÚ ablakot definiál, amely az aktuális sorral kezdődik és a partíció utolsó sorával végződik.
< aláíratlan érték specifikáció > KÖVETKEZŐ
< aláíratlan érték specifikációval megadva > a sorok vagy értékek az aktuális sor követéséhez. Ha < aláíratlan értékspecifikáció > FOLLOWING van megadva ablak kezdőpontként, akkor a végpontnak < aláíratlan érték specifikáció > KÖVETKEZŐ. Például a 2 KÖVETKEZŐ ÉS 10 KÖVETKEZŐ SOROK ablakot határoz meg, amely az aktuális sort követő második sorral kezdődik, és az aktuális sort követő tizedik sorral végződik. Ez a specifikáció nem engedélyezett a RANGE számára.
aláíratlan egész literál
Érvényes: SQL Server 2012 (11.x) és újabb verziók.
Pozitív egész literál (beleértve a 0-t is) ), amely meghatározza az aktuális sort vagy értéket megelőző vagy követő sorok vagy értékek számát. Ez a specifikáció csak a ROWS-ra érvényes.
Általános megjegyzések
Egynél több ablakfunkció használható egyetlen lekérdezésben egyetlen FROM záradékkal. Minden funkció függvényében az OVER záradék különbözhet a felosztásban és a sorrendben.
Ha a PARTITION BY nincs megadva, akkor a függvény a lekérdezés eredményhalmazának minden sorát egyetlen csoportként kezeli.
Fontos !
Ha a ROWS / RANGE meg van adva, és a < ablakkeretet megelőzi a > < ablakkeret kiterjedése > (rövid szintaxis), akkor ezt a specifikációt használják az ablakkeret határ kezdőpontjához, és a CURRENT ROW a határ végpontjához. Például az “5. SOROK ELŐZMÉNYE” egyenlő: “AZ ELŐZŐ SOROK ÉS AZ AKTUÁLIS SOROK KÖZÖTT”.
Megjegyzés
Ha nincs megadva ORDER BY, akkor a teljes partíciót használjuk ablakkeret.Ez csak azokra a funkciókra vonatkozik, amelyekhez nincs szükség ORDER BY záradékra. Ha a ROWS / RANGE nincs megadva, de a ORDER BY meg van adva, alapértelmezettként az RANGE UNBOUNDED PRECEDING AND CURRENT ROW kerül felhasználásra az ablakkeretnél. Ez csak azokra a funkciókra vonatkozik, amelyek képesek elfogadni az opcionális ROWS / RANGE specifikációt. Például a rangsorolási függvények nem fogadják el a ROWS / RANGE elemet, ezért ezt az ablakkeretet akkor sem alkalmazzák, ha a ORDER BY megvan, a ROWS / RANGE pedig nincs.
Korlátozások és korlátozások
Az OVER záradék nem használható a CHECKSUM aggregate függvénnyel.
A RANGE nem használható < aláíratlan érték specifikációval > ELŐZŐ vagy < aláíratlan érték specifikáció > KÖVETKEZŐ.
A rangsorolástól, összesítéstől vagy elemzéstől függően az OVER záradékkal használt függvény, < ORDER BY záradék > és / vagy a < A RIVS és a RANGE záradék > nem biztos, hogy támogatott.
Példák
A. Az OVER záradék használata a ROW_NUMBER függvénnyel
Az alábbi példa az OVER záradék használatát mutatja a ROW_NUMBER függvénnyel, hogy a partíción belül minden sorhoz sorszámot jelenítsen meg. Az OVER záradékban megadott ORDER BY záradék az egyes partíciók sorait a SalesYTD
oszlop alapján rendezi meg. A SELECT utasítás ORDER BY záradéka meghatározza a teljes lekérdezés eredményhalmazának sorrendjét.
Itt található az eredménykészlet.
B. Az OVER záradék használata összesített függvényekkel
A következő példa a OVER
záradékot használja összesítő függvényekkel a lekérdezés által visszaadott összes sorra. Ebben a példában a OVER
záradék használata hatékonyabb, mint az alkérdezések használata az összesített értékek levezetésére.
Itt található az eredménykészlet.
Az alábbi példa a OVER
záradék használatát mutatja egy összesített függvénnyel egy kiszámított értékben.
Itt található az eredménykészlet. Figyelje meg, hogy az aggregátumokat SalesOrderID
számítja ki, és a Percent by ProductID
számításokat minden SalesOrderID
.
C. Mozgó átlag és összesített összeg előállítása
A következő példa az AVG és SUM függvényeket használja az OVER klauzulával, hogy mozgóátlagot és összesített összesített éves összértéket adjon meg az egyes területekre a Sales.SalesPerson
táblázat. Az adatokat TerritoryID
particionálja, és logikusan a SalesYTD
rendezi. Ez azt jelenti, hogy az AVG függvény minden területre kiszámításra kerül az értékesítési év alapján. Figyelje meg, hogy a TerritoryID
1 esetében a 2005-ös értékesítési évre két sor tartozik, amelyek a két értékesítőt képviselik abban az évben. Ennek a két sornak az átlagos eladását kiszámítják, majd a harmadik sor a 2006-os év értékesítését mutatja be a számításba.
Itt található az eredménykészlet.
Ebben a példában az OVER záradék nem tartalmazza a PARTITION BY-t. Ez azt jelenti, hogy a függvény a lekérdezés által visszaadott összes sorra vonatkozik. Az OVER záradékban megadott ORDER BY záradék határozza meg az AVG függvény logikai sorrendjét. A lekérdezés az eladások mozgó átlagát adja vissza évente a WHERE záradékban megadott összes értékesítési területre. A SELECT utasításban megadott ORDER BY záradék meghatározza a lekérdezés sorainak megjelenítési sorrendjét.
Itt található az eredménykészlet.
D. A ROWS záradék megadása
Érvényes: SQL Server 2012 (11.x) és újabb verziók.
A következő példa a ROWS záradékkal definiálja azt az ablakot, amelyre a sorokat kiszámítják az aktuális sor és a következő sorok N száma (ebben a példában 1 sor).
Itt található az eredménykészlet.
A következő példában a ROWS záradék meg van adva a KÖRNYEZETT ELŐZETES. Ennek eredményeként az ablak a partíció első sorától indul.
Itt található az eredménykészlet.
Példák: Párhuzamos adattárház
E. Az OVER záradék használata a ROW_NUMBER függvénnyel
Az alábbi példa a ROW_NUMBER számot adja vissza az értékesítési képviselők számára a hozzájuk rendelt értékesítési kvóta alapján.
Itt van egy részleges eredménykészlet.
F. Az OVER záradék használata összesített függvényekkel
A következő példák az OVER záradék összesített függvényekkel történő használatát mutatják be. Ebben a példában az OVER záradék használata hatékonyabb, mint az alkérdezések használata.
Itt található az eredménykészlet.
A következő példa mutatja az OVER záradékot egy összesített függvénnyel egy számított értékben. Figyelje meg, hogy az aggregátumokat a SalesOrderNumber
számítja ki, és a teljes értékesítési megrendelés százalékát kiszámítja az egyes SalesOrderNumber
sorokba.
Ennek az eredménykészletnek az első kezdete:
Lásd még:
Összesített függvények (Transact-SQL)
Analitikus függvények (Transact-SQL)
Kiváló blogbejegyzés az ablakfunkciókról és az OVER-ről, az sqlmag.com-on, Itzik Ben-Gan