Problem:
Du vill jämföra rankingen som produceras av RANK
och DENSE_RANK
och lägg till dem som nya kolumner i en tabell.
Exempel:
Vår databas har en tabell som heter sales_assistant
med data i följande kolumner:id
(primär nyckel), first_name
, last_name
, month
och sold products
.
id | förnamn | efternamn | månad | sålda produkter |
---|---|---|---|---|
1 | Lisa | Svart | 5 | 2300 |
2 | Maria | Jacobs | 5 | 2400 |
3 | Lisa | Svart | 6 | 2700 |
4 | Maria | Jacobs | 6 | 2700 |
5 | Alex | Smith | 6 | 2900 |
6 | Maria | Jacobs | 7 | 1200 |
7 | Lisa | Svart | 7 | 1200 |
8 | Alex | Smith | 7 | 1000 |
Låt oss visa varje säljassistents för- och efternamn och antal sålda produkter. Vi vill också rangordna dem efter antalet sålda produkter i fallande ordning.
Lösning 1:
VÄLJ RANK() ÖVER(ORDER BY sålda produkter DESC) AS r, DENSE_RANK() OVER(ORDER BY sålda produkter DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistent;
Den här frågan returnerar två rankningar:en producerad av RANK
och en annan av DENSE_RANK
. Vad är skillnaden?
Enkelt uttryckt, RANK
hoppar över antalet positioner efter poster med samma rangnummer. Rankingen RANK_DENSE
returnerar positionsnummer från 1 till 6 eftersom det inte hoppar över poster med samma rangnummer:
r | dr | förnamn | efternamn | månad | sålda produkter |
---|---|---|---|---|---|
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Svart | 6 | 2700 |
2 | 2 | Maria | Jacobs | 6 | 2700 |
4 | 3 | Maria | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Svart | 5 | 2300 |
6 | 5 | Maria | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Svart | 7 | 1200 |
8 | 6 | Alex | Smith | 7 | 1000 |
Diskussion:
Om du vill rangordna rader i resultatuppsättningen erbjuder SQL RANK()
och DENSE_RANK
funktioner. Dessa funktioner används i SELECT
med andra kolumner. Efter RANK
eller DENSE_RANK
, kallar vi OVER()
funktion, som tar en ORDER BY
sats med namnet på kolumnen för att sortera innan du tilldelar en rangordning.
Till skillnad från DENSE_RANK
, RANK
hoppar över positioner efter lika ranking. Antalet positioner som hoppades över beror på hur många rader som hade samma rankning. Till exempel sålde Mary och Lisa samma antal produkter och är båda rankade som #2. Med RANK
, nästa position är #4; med DENSE_RANK
, nästa position är #3.
Båda RANK
och RANK_DENSE
arbete med partitioner av data:
Lösning 1:
VÄLJ RANK() ÖVER(PARTITION BY month ORDER BY sålda produkter DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sålda produkter DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistent;Du kan dela upp poster i grupper enligt en given kolumn (i vårt exempel,
month
). I den här situationen rankas poster som en del av en partition:
r | dr | förnamn | efternamn | månad | sålda produkter |
---|---|---|---|---|---|
1 | 1 | Maria | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Svart | 5 | 2300 |
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Svart | 6 | 2700 |
2 | 2 | Maria | Jacobs | 6 | 2700 |
1 | 1 | Maria | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Svart | 7 | 1200 |
3 | 2 | Alex | Smith | 7 | 1000 |