RANK-funksjonen i SQL Server er en slags rangeringsfunksjon. Denne funksjonen vil tilordne nummeret til hver rad innenfor partisjonen til en utgang . Den tildeler rangeringen til hver rad som én pluss den forrige radrangeringen. Når RANK-funksjonen finner to verdier som er identiske innenfor samme partisjon, tildeler den dem samme rangeringsnummer. I tillegg vil neste nummer i rangeringen være forrige rangering pluss duplikatnummer. Derfor tildeler denne funksjonen ikke alltid rangeringen av rader i fortløpende rekkefølge.
RANK-funksjonen er også en underdel av vindusfunksjoner. Følgende punkter bør huskes når du bruker denne funksjonen :
- Det fungerer alltid med OVER()-leddet.
- Den tildeler en rangering til hver rad basert på ORDER BY-klausulen.
- Den tildeler en rangering til hver rad i fortløpende rekkefølge.
- Den tildeler alltid en rangering til rader, og starter med én for hver nye partisjon.
MERK: Rangering tildeler midlertidige verdier for rader i partisjonen når spørringen utføres.
SQL Server tilbyr følgende rangeringsfunksjoner :
- RANG()
- ROW_NUMBER()
- DENSE_RANK()
- NTILE()
La oss lære hver rangeringsfunksjon i detalj. Først skal vi lage en tabell for demonstrasjon av alle disse funksjonene. Følgende utsagn lager en tabell med navn rang_demo med tre kolonner:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
Deretter vil vi sette inn noen rader i denne tabellen som nedenfor:
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');
Vi kan verifisere tabellen ved å bruke SELECT-setningen. Den viser utgangen nedenfor:
RANK() funksjon
Denne funksjonen brukes til å bestemme rangeringen for hver rad i resultatsettet. Følgende syntaks illustrerer bruken av en RANK-funksjon i SQL Server:
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
I denne syntaksen,
- De OVER-klausul setter partisjonering og rekkefølge av et resultat før den tilknyttede vindusfunksjonen brukes.
- De PARTITION BY klausul deler utdataene som produseres av FROM-leddet inn i partisjonen. Deretter brukes funksjonen på hver partisjon og initialiseres på nytt når divisjonsgrensen krysser partisjoner. Hvis vi ikke har definert denne klausulen, vil funksjonen behandle alle rader som en enkelt partisjon.
- De REKKEFØLGE ETTER er en obligatorisk klausul som bestemmer rekkefølgen på radene på en synkende eller stigende måte basert på ett eller flere kolonnenavn før funksjonen brukes.
Eksempel
La oss se hvordan RANK()-funksjonen fungerer i SQL Server. Utsagnet nedenfor vil bruke rangeringsfunksjonen til å tilordne nummerering for hver rad:
java sortering arraylist
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Siden vi ikke har brukt PARTITION BY klausul , behandlet funksjonen hele resultatet som en enkelt partisjon. Utførelse av setningen vil vise følgende utdata:
I denne utgangen kan vi se at noen av radene får samme rangering fordi de har samme verdi i bykolonne . Og det neste tallet i rangeringen vil være dets forrige rangering pluss et antall dupliserte tall.
Følgende uttalelse er et annet eksempel hvor vi skal bruke en partisjon etter klausul som vil dele radene basert på by kolonne og tilordne en rangering til hver rad i en partisjon. Rekkefølgen på utdataene er basert på fornavn :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
Det vil vise utgangen nedenfor:
ROW_NUMBER() funksjon
Denne funksjonen brukes til returner det unike sekvensnummeret for hver rad innenfor partisjonen. Radnummereringen begynner på én og øker med én til partisjonens totale antall rader er nådd. Den vil returnere de forskjellige rangeringene for raden som har lignende verdier som gjør den forskjellig fra RANK()-funksjonen.
Syntaksen nedenfor illustrerer bruken av en ROW_NUMBER()-funksjon i SQL Server:
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Eksempel
Utfør følgende spørring for å tilordne et sekvensnummer for hver rad:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Det vil tildele rangeringen for tabellen i henhold til deres by . Her kan vi se at den tildeler forskjellige rangeringer for raden som har samme byverdier.
Hvis vi endrer sorteringsrekkefølgen fra stigende til synkende med ORDER BY-klausulen vil denne funksjonen også endre RANK tilsvarende. Se uttalelsen nedenfor:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
Her er resultatet:
DENSE_RANK() funksjon
Denne funksjonen tildeler en unik rangering for hver rad i en partisjon i henhold til den angitte kolonneverdien uten hull. Den spesifiserer alltid rangering i fortløpende rekkefølge. Hvis vi får en duplikatverdi , vil denne funksjonen tildele den samme rangering, og neste rangering er neste sekvensnummer. Denne egenskapen skiller DENSE_RANK()-funksjonen fra RANK()-funksjonen.
Syntaksen nedenfor illustrerer bruken av en DENSE_RANK()-funksjon i SQL Server:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Eksempel
Følgende spørring bruker funksjonen DENSE_RANK() for å tilordne et rangeringsnummer for hver rad:
tostring-metoden
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Det vil returnere utgangen nedenfor der vi kan se at dupliserte verdier har samme rangering, og følgende rangering vil være det neste sekvensnummeret.
Det er et annet eksempel på funksjonen DENSE_RANK() ved å bruke PARTITION BY-leddet. Denne klausulen vil dele radene basert på bykolonnen, og rekkefølgen til et resultatsett er basert på fornavnet:
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
Vi vil få utdataene nedenfor fordi ingen navn er like. I dette tilfellet ligner utgangen RANK()-funksjonen.
La oss oppdatere navnet med følgende spørring:
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
Utfør den samme spørringen igjen. Vi vil se at denne tabellen fikk samme navn California City . Derfor er rangeringen også lik for begge navnene.
NTILE(N) funksjon
Denne funksjonen brukes til distribuere rader av en ordnet partisjon til et forhåndsdefinert antall (N) av omtrent like grupper. Hver radgruppe får sin rangering basert på den definerte betingelsen og begynner å nummerere fra én gruppe. Den tildeler en bøttenummer for hver rad i en gruppe som representerer gruppen den tilhører.
Følgende syntaks illustrerer bruken av en NTILE()-funksjon i SQL Server:
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Eksempel
Følgende spørring bruker NTILE()-funksjonen til å tilordne et rangeringsnummer for hver rad:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
Den angitte tabellen har åtte rekorder . derfor NTILE(3) forteller at resultatsettet må ha en gruppe på tre plater . Utførelse av setningen vil vise følgende utdata:
Denne artikkelen vil forklare alle RANK-funksjonene som brukes i SQL Server med forskjellige eksempler. Den viser også hovedforskjellene mellom disse funksjonene. Disse funksjonene er svært nyttige for utviklere for å utforske og administrere dataene deres godt.