sql >> Database >  >> RDS >> Database

Wat is het verschil tussen RANK en DENSE_RANK in SQL?

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

  1. IF...THEN logica gebruiken in SQL Server

  2. Array toewijzen met Hibernate

  3. Gebruik DB_ID() om de ID van een database in SQL Server te retourneren

  4. Krijg een lijst met datums tussen twee datums met behulp van een functie