Problem:
Du ønsker at sammenligne placeringerne produceret af RANK
og DENSE_RANK
og tilføje dem som nye kolonner til en tabel.
Eksempel:
Vores database har en tabel med navnet sales_assistant
med data i følgende kolonner:id
(primær nøgle), first_name
, last_name
, month
, og sold products
.
id | fornavn | efternavn | måned | solgte produkter |
---|---|---|---|---|
1 | Lisa | Sort | 5 | 2300 |
2 | Mary | Jacobs | 5 | 2400 |
3 | Lisa | Sort | 6 | 2700 |
4 | Mary | Jacobs | 6 | 2700 |
5 | Alex | Smith | 6 | 2900 |
6 | Mary | Jacobs | 7 | 1200 |
7 | Lisa | Sort | 7 | 1200 |
8 | Alex | Smith | 7 | 1000 |
Lad os vise hver salgsassistents for- og efternavn og antallet af solgte produkter. Vi ønsker også at rangere dem i forhold til antallet af solgte produkter i faldende rækkefølge.
Løsning 1:
VÆLG RANK() OVER(ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistant;
Denne forespørgsel returnerer to rangeringer:en produceret af RANK
og en anden efter DENSE_RANK
. Hvad er forskellen?
Kort sagt, RANK
springer antallet af positioner over efter poster med samme rangnummer. Rangeringen RANK_DENSE
returnerer positionsnumre fra 1 til 6, fordi den ikke springer poster med samme rangnummer over:
r | dr | fornavn | efternavn | måned | solgte produkter |
---|---|---|---|---|---|
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Sort | 6 | 2700 |
2 | 2 | Mary | Jacobs | 6 | 2700 |
4 | 3 | Mary | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Sort | 5 | 2300 |
6 | 5 | Mary | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Sort | 7 | 1200 |
8 | 6 | Alex | Smith | 7 | 1000 |
Diskussion:
Hvis du gerne vil rangere rækker i resultatsættet, tilbyder SQL RANK()
og DENSE_RANK
funktioner. Disse funktioner bruges i SELECT
med andre kolonner. Efter RANK
eller DENSE_RANK
, kalder vi OVER()
funktion, som tager en ORDER BY
klausul med navnet på kolonnen for at sortere, før der tildeles en rangering.
I modsætning til DENSE_RANK
, RANK
springer positioner over efter lige placeringer. Antallet af stillinger, der springes over, afhænger af, hvor mange rækker der havde en identisk placering. For eksempel solgte Mary og Lisa det samme antal produkter og er begge rangeret som #2. Med RANK
, den næste position er #4; med DENSE_RANK
, den næste position er #3.
Begge RANK
og RANK_DENSE
arbejde på partitioner af data:
Løsning 1:
VÆLG RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistant;Du kan opdele poster i grupper i henhold til en given kolonne (i vores eksempel,
month
). I denne situation rangeres poster som en del af en partition:
r | dr | fornavn | efternavn | måned | solgte produkter |
---|---|---|---|---|---|
1 | 1 | Mary | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Sort | 5 | 2300 |
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Sort | 6 | 2700 |
2 | 2 | Mary | Jacobs | 6 | 2700 |
1 | 1 | Mary | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Sort | 7 | 1200 |
3 | 2 | Alex | Smith | 7 | 1000 |