sql >> Databáze >  >> RDS >> Database

Jaký je rozdíl mezi RANK a DENSE_RANK v SQL?

Problém:

Chcete porovnat hodnocení vytvořené RANK a DENSE_RANK a přidejte je jako nové sloupce do tabulky.

Příklad:

Naše databáze obsahuje tabulku s názvem sales_assistant s údaji v následujících sloupcích:id (primární klíč), first_name , last_name , month a sold products .

id křestní_jméno last_name měsíc prodané produkty
1 Lisa Černá 5 2300
2 Marie Jacobs 5 2400
3 Lisa Černá 6 2700
4 Marie Jacobs 6 2700
5 Alex Smith 6 2900
6 Marie Jacobs 7 1200
7 Lisa Černá 7 1200
8 Alex Smith 7 1000

Zobrazme jméno a příjmení každého prodejního asistenta a počet prodaných produktů. Chceme je také seřadit podle počtu prodaných produktů v sestupném pořadí.

Řešení 1:

VYBERTE POŘADÍ() NAD (ORDER BY prodaných produktů DESC) AS r, DENSE_RANK() NAD(ORDER BY prodaných produktů DESC) AS dr, jméno, příjmení, měsíc, prodané produktyFROM sales_assistant;

Tento dotaz vrací dvě hodnocení:jedno vytvořené RANK a další podle DENSE_RANK . Jaký je rozdíl?

Jednoduše řečeno, RANK přeskočí počet pozic za záznamy se stejným pořadovým číslem. Hodnocení RANK_DENSE vrátí čísla pozic od 1 do 6, protože nepřeskočí záznamy se stejným pořadovým číslem:

r dr křestní_jméno last_name měsíc prodané produkty
1 1 Alex Smith 6 2900
2 2 Lisa Černá 6 2700
2 2 Marie Jacobs 6 2700
4 3 Marie Jacobs 5 2400
5 4 Lisa Černá 5 2300
6 5 Marie Jacobs 7 1200
6 5 Lisa Černá 7 1200
8 6 Alex Smith 7 1000

Diskuse:

Pokud chcete seřadit řádky v sadě výsledků, SQL nabízí RANK() a DENSE_RANK funkcí. Tyto funkce se používají v SELECT s dalšími sloupci. Po RANK nebo DENSE_RANK , nazýváme OVER() funkce, která přebírá ORDER BY klauzule s názvem sloupce k řazení před přiřazením hodnocení.

Na rozdíl od DENSE_RANK , RANK přeskakuje pozice po stejném umístění. Počet vynechaných pozic závisí na tom, kolik řádků mělo stejné pořadí. Například Mary a Lisa prodaly stejný počet produktů a obě jsou na 2. místě. S RANK , další pozice je #4; s DENSE_RANK , další pozice je #3.

Oba RANK a RANK_DENSE práce na oddílech dat:

Řešení 1:

VYBERTE POŘADÍ() NAD (ODDĚLENÍ PODLE měsíce ORDER BY PRODANÉ PRODUKTY DESC) AS r, DENSE_RANK() NAD(ODDĚLENÍ PODLE měsíce ORDER BY PRODANÉ produkty DESC) AS dr, jméno, příjmení, měsíc, prodané produktyFROM sales_assistant; 

Záznamy můžete rozdělit do skupin podle daného sloupce (v našem příkladu month ). V této situaci jsou záznamy zařazeny jako součást oddílu:

r dr křestní_jméno last_name měsíc prodané produkty
1 1 Marie Jacobs 5 2400
2 2 Lisa Černá 5 2300
1 1 Alex Smith 6 2900
2 2 Lisa Černá 6 2700
2 2 Marie Jacobs 6 2700
1 1 Marie Jacobs 7 1200
1 1 Lisa Černá 7 1200
3 2 Alex Smith 7 1000

  1. Jak získat první a poslední den předchozího měsíce (s časovým razítkem) na SQL Server

  2. Vytvořte omezení CHECK v SQLite

  3. Zda použít SET NAMES

  4. Regulární výrazy uvnitř SQL Serveru