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 |