sql >> Database teknologi >  >> RDS >> Database

Hvad er forskellen mellem RANK og DENSE_RANK i SQL?

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

  1. Lær din SQL Server-arbejdsbelastning at kende

  2. Oprettelse af et testmiljø fra et produktionslager

  3. Installation af MariaDB 10.1 i Debian Jessie og kørsel af forskellige MariaDB-forespørgsler

  4. Ydelsesproblemer med SQL Server 2012 Enterprise Edition under CAL-licens