Probleem:
U wilt de rankings vergelijken die zijn geproduceerd door RANK
en DENSE_RANK
en voeg ze toe als nieuwe kolommen aan een tabel.
Voorbeeld:
Onze database heeft een tabel met de naam sales_assistant
met gegevens in de volgende kolommen:id
(primaire sleutel), first_name
, last_name
, month
, en sold products
.
id | voornaam | achternaam | maand | verkochte producten |
---|---|---|---|---|
1 | Lisa | Zwart | 5 | 2300 |
2 | Maria | Jacobs | 5 | 2400 |
3 | Lisa | Zwart | 6 | 2700 |
4 | Maria | Jacobs | 6 | 2700 |
5 | Alex | Smith | 6 | 2900 |
6 | Maria | Jacobs | 7 | 1200 |
7 | Lisa | Zwart | 7 | 1200 |
8 | Alex | Smith | 7 | 1000 |
Laten we de voor- en achternaam van elke verkoopassistent en het aantal verkochte producten weergeven. We willen ze ook rangschikken in termen van het aantal verkochte producten in aflopende volgorde.
Oplossing 1:
SELECT 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 products FROM sales_assistant;
Deze zoekopdracht levert twee rankings op:één geproduceerd door RANK
en nog een door DENSE_RANK
. Wat is het verschil?
Simpel gezegd, RANK
slaat het aantal posities over na records met hetzelfde rangnummer. De ranglijst RANK_DENSE
retourneert positienummers van 1 tot 6 omdat het geen records met hetzelfde rangnummer overslaat:
r | dr | voornaam | achternaam | maand | verkochte producten |
---|---|---|---|---|---|
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Zwart | 6 | 2700 |
2 | 2 | Maria | Jacobs | 6 | 2700 |
4 | 3 | Maria | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Zwart | 5 | 2300 |
6 | 5 | Maria | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Zwart | 7 | 1200 |
8 | 6 | Alex | Smith | 7 | 1000 |
Discussie:
Als u rijen in de resultatenset wilt rangschikken, biedt SQL de RANK()
en DENSE_RANK
functies. Deze functies worden gebruikt in SELECT
met andere kolommen. Na RANK
of DENSE_RANK
, noemen we de OVER()
functie, waarvoor een ORDER BY
. nodig is clausule met de naam van de kolom die moet worden gesorteerd voordat een rangorde wordt toegewezen.
In tegenstelling tot DENSE_RANK
, RANK
slaat posities over na gelijke rankings. Het aantal overgeslagen posities hangt af van hoeveel rijen een identieke rangschikking hadden. Mary en Lisa hebben bijvoorbeeld hetzelfde aantal producten verkocht en staan beide op nummer 2. Met RANK
, de volgende positie is #4; met DENSE_RANK
, de volgende positie is #3.
Beide RANK
en RANK_DENSE
werk aan partities van gegevens:
Oplossing 1:
SELECT 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 products FROM sales_assistant;
U kunt records opsplitsen in groepen volgens een bepaalde kolom (in ons voorbeeld month
). In deze situatie worden records gerangschikt als onderdeel van een partitie:
r | dr | voornaam | achternaam | maand | verkochte producten |
---|---|---|---|---|---|
1 | 1 | Maria | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Zwart | 5 | 2300 |
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Zwart | 6 | 2700 |
2 | 2 | Maria | Jacobs | 6 | 2700 |
1 | 1 | Maria | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Zwart | 7 | 1200 |
3 | 2 | Alex | Smith | 7 | 1000 |