sql >> Databasteknik >  >> RDS >> Database

Vad är skillnaden mellan RANK och DENSE_RANK i SQL?

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

  1. Få kuvert, dvs överlappande tidsintervall

  2. Förstå dataarkitekternas roll i datastyrning

  3. Hur man importerar en Heroku PG-dump till lokal maskin

  4. Visa SQL Server Agent jobbhistorik med SSMS