Az SQL Server RANK függvénye egyfajta rangsorolási függvény. Ez a funkció rendelje hozzá a számot a kimenet partícióján belüli minden sorhoz . Minden sorhoz egy plusz az előző sor rangot rendeli hozzá. Ha a RANK függvény két azonos értéket talál ugyanazon a partíción belül, akkor ugyanazt a rangszámot rendeli hozzá. Ezenkívül a rangsorban következő szám az előző helyezés plusz a duplikált számok lesznek. Ezért ez a funkció nem mindig egymás utáni sorrendben rendeli hozzá a sorok rangsorát.
A RANK funkció szintén az ablakfunkciók alrésze. A funkció használata során ne feledje a következő pontokat :
- Mindig az OVER() záradékkal működik.
- Minden sorhoz rangot rendel az ORDER BY záradék alapján.
- Minden sorhoz rangot rendel egymás utáni sorrendben.
- Mindig rangot rendel a sorokhoz, minden új partícióhoz eggyel kezdve.
MEGJEGYZÉS: A Rank ideiglenes értékeket rendel a partíción belüli sorokhoz a lekérdezés végrehajtásakor.
Az SQL Server a következő rangsorolási funkciókat biztosítja :
- RANG()
- ROW_NUMBER()
- DENSE_RANK()
- TILE()
Tanuljunk meg minden rangfüggvényt részletesen. Először is készítünk egy táblázatot, amely bemutatja ezeket a funkciókat. A következő utasítások egy nevű táblát hoznak létre rang_demo három oszloppal:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
Ezután az alábbiak szerint beszúrunk néhány sort ebbe a táblázatba:
INSERT INTO rank_demo (first_name, last_name, city) VALUES ('Luisa', 'Evans', 'Texas'), ('Paul', 'Ward', 'Alaska'), ('Peter', 'Bennett', 'California'), ('Carlos', 'Patterson', 'New York'), ('Rose', 'Huges', 'Florida'), ('Marielia', 'Simmons', 'Texas'), ('Antonio', 'Butler', 'New York'), ('Diego', 'Cox', 'California');
A táblát a SELECT utasítással tudjuk ellenőrizni. Az alábbi kimenetet jeleníti meg:
RANK() függvény
Ez a funkció az eredményhalmaz egyes sorai rangjának meghatározására szolgál. A következő szintaxis egy RANK függvény használatát mutatja be az SQL Serverben:
string formátum java
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Ebben a szintaxisban
- A OVER záradék beállítja az eredmények particionálását és sorrendjét a kapcsolódó ablakfüggvény alkalmazása előtt.
- A PARTÍCIÓ záradékkal a FROM záradék által termelt kimenetet a partícióra osztja. Ezután a funkció minden partícióra érvényesül, és újrainicializálódik, amikor az osztáshatár keresztezi a partíciókat. Ha nem definiáltuk ezt a záradékot, a függvény az összes sort egyetlen partícióként kezeli.
- A RENDEZÉS egy kötelező záradék, amely a függvény alkalmazása előtt egy vagy több oszlopnév alapján csökkenő vagy növekvő módon határozza meg a sorok sorrendjét.
Példa
Nézzük meg, hogyan működik a RANK() függvény az SQL Serverben. Az alábbi utasítás a rang függvényt fogja használni az egyes sorok számozásához:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Mivel nem használtuk a PARTÍCIÓ záradékkal , a függvény a teljes eredményt egyetlen partícióként kezelte. Az utasítás végrehajtása az alábbi kimenetet jeleníti meg:
Ebben a kimenetben láthatjuk, hogy néhány sor ugyanazt a rangot kapja, mert ugyanaz az értékük a város oszlop . És a következő szám a rangsorban a korábbi rangja, plusz néhány ismétlődő szám lesz.
A következő állítás az egy másik példa ahol olyan partíciót fogunk használni, amely az alapján osztja fel a sorokat város oszlopot, és rendeljen rangsort a partíción belül minden sorhoz. A kimenet sorrendje a keresztnév :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
Az alábbi kimenetet jeleníti meg:
linux make parancs
ROW_NUMBER() függvény
Ez a funkció hozzászokott minden sor egyedi sorszámát adja vissza partícióján belül. A sorszámozás eggyel kezdődik, és eggyel nő, amíg el nem éri a partíció sorainak teljes számát. A sor különböző rangjait adja vissza, amelyek hasonló értékekkel különböznek a RANK() függvénytől.
Az alábbi szintaxis egy ROW_NUMBER() függvény használatát mutatja be az SQL Serverben:
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Példa
Hajtsa végre a következő lekérdezést, hogy sorszámot rendeljen az egyes sorokhoz:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Ez hozzárendeli a táblázat rangsorát a sajátjuk szerint város . Itt láthatjuk, hogy különböző rangokat rendel az azonos városértékekkel rendelkező sorhoz.
Ha megváltoztatjuk a rendezési sorrendet a emelkedőtől csökkenőig az ORDER BY záradékkal ez a funkció a RANK-ot is ennek megfelelően módosítja. Lásd az alábbi nyilatkozatot:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
Íme az eredmény:
DENSE_RANK() függvény
Ez a funkció hozzárendeli egy egyedi rangot a partíción belül minden sorhoz a megadott oszlopérték szerint, hézagok nélkül. Mindig egymás utáni sorrendben adja meg a rangsort. Ha kapunk a duplikált érték , ez a funkció ugyanazzal a ranggal rendeli hozzá, és a következő rang a következő sorszám lesz. Ez a jellemző eltér a DENSE_RANK() függvénytől a RANK() függvénytől.
Az alábbi szintaxis egy DENSE_RANK() függvény használatát mutatja be az SQL Serverben:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Példa
A következő lekérdezés a DENSE_RANK() függvényt használja, hogy minden sorhoz rangszámot rendeljen:
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Az alábbi kimenetet adja vissza, ahol láthatjuk, hogy a duplikált értékek azonos rangúak, és a következő rang lesz a következő sorszám.
Ez egy másik példa a DENSE_RANK() függvényre a PARTITION BY záradék használatával. Ez a záradék a város oszlop alapján osztja fel a sorokat, és az eredménykészlet sorrendje a first_name függvényen alapul:
Java hivatkozási típusok
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
Az alábbi kimenetet kapjuk, mert nincs két egyforma név. Ebben az esetben a kimenet hasonló a RANK() függvényhez.
Frissítsük a nevet a következő lekérdezéssel:
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
Most hajtsa végre újra ugyanazt a lekérdezést. Látni fogjuk, hogy ez a táblázat ugyanazt a nevet kapta California City . Ezért a rang is azonos mindkét névnél.
TILE(N) funkció
Ez a funkció hozzászokott elosztja egy rendezett partíció sorait egy előre meghatározott számba (N) megközelítőleg egyenlő csoportok. Minden sorcsoport megkapja a rangját a meghatározott feltétel alapján, és egy csoporttól kezdi a számozást. Kijelöli a vödör száma egy csoport minden sorára, amely azt a csoportot képviseli, amelyhez tartozik.
A következő szintaxis az NTILE() függvény használatát mutatja be az SQL Serverben:
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Példa
A következő lekérdezés az NTILE() függvényt használja, hogy minden sorhoz rangszámot rendeljen:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
A megadott táblázat rendelkezik nyolc lemez . Ezért a TILE (3) azt mondja, hogy az eredményhalmaznak rendelkeznie kell a három lemezből álló csoport . Az utasítás végrehajtása az alábbi kimenetet jeleníti meg:
Ez a cikk az SQL Serverben használt összes RANK függvényt ismerteti különféle példákkal. Megmutatja a funkciók közötti főbb különbségeket is. Ezek a funkciók nagyon hasznosak a fejlesztők számára az adatok megfelelő feltárásához és kezeléséhez.