V SQL Server, DENSE_RANK()
Funkce vrací pořadí každého řádku v rámci oddílu sady výsledků. Pořadí řádku je jedna plus počet odlišných řádků, které jsou před řádkem.
Tato funkce je podobná funkci RANK()
, ale bez mezer v hodnotách hodnocení, které se mohou vyskytnout u RANK()
když ve výsledné sadě existují vazby.
Syntaxe
Syntaxe vypadá takto:
DENSE_RANK ( ) OVER ( [] < order_by_clause > )
FROM
klauzule do oddílů, na které je funkce aplikována. Pokud není zadáno, jsou všechny řádky sady výsledků dotazu považovány za jednu skupinu.
Všimněte si, že OVER
klauzule normálně přijímá
Příklad 1 – Základní použití
Zde je základní příklad ukazující použití DENSE_RANK()
funkce:
SELECT AlbumId, AlbumName, ArtistId, DENSE_RANK() OVER (ORDER BY ArtistId ASC) 'Rank' FROM Albums;
Výsledek:
+-----------+--------------------------+------------+--------+ | AlbumId | AlbumName | ArtistId | Rank | |-----------+--------------------------+------------+--------| | 1 | Powerslave | 1 | 1 | | 7 | Somewhere in Time | 1 | 1 | | 8 | Piece of Mind | 1 | 1 | | 9 | Killers | 1 | 1 | | 10 | No Prayer for the Dying | 1 | 1 | | 2 | Powerage | 2 | 2 | | 19 | All Night Wrong | 3 | 3 | | 20 | The Sixteen Men of Tain | 3 | 3 | | 12 | Big Swing Face | 4 | 4 | | 4 | Ziltoid the Omniscient | 5 | 5 | | 5 | Casualties of Cool | 5 | 5 | | 6 | Epicloud | 5 | 5 | | 3 | Singing Down the Lane | 6 | 6 | | 16 | Long Lost Suitcase | 7 | 7 | | 17 | Praise and Blame | 7 | 7 | | 18 | Along Came Jones | 7 | 7 | | 11 | No Sound Without Silence | 9 | 8 | | 21 | Yo Wassup | 9 | 8 | | 22 | Busted | 9 | 8 | | 13 | Blue Night | 12 | 9 | | 14 | Eternity | 12 | 9 | | 15 | Scandinavia | 12 | 9 | +-----------+--------------------------+------------+--------+
Podívejte se na ArtistId a Hodnocení sloupců. Hodnocení se zvyšuje pokaždé, když se zvýší ID umělce. Je to proto, že objednávám podle ArtistId, a tak každý nový umělec získá novou hodnost.
Pořadí zůstává u každého interpreta stejné, bez ohledu na to, kolik řádků obsahuje stejné ArtistId, protože výsledky jsou seřazeny podle tohoto sloupce. Například pět řádků obsahuje stejné ArtistId, a proto také obsahují stejnou hodnost. Jinými slovy, všichni jsou na 1. místě.
V mnoha řádcích je hodnost shodná s ArtistId, ale to je jen náhoda. Náhodou se stane, že ArtistId je IDENTITY
sloupec, který začíná na 1 a zvyšuje se o 1, což je také RANK()
dělá. Uvidíte však, že nejsou na všech řádcích stejné. Například ArtistId přeskočí ze 7 na 9, ale hodnocení se jednoduše zvýší ze 7 na 8 a od tohoto okamžiku oba sloupce obsahují různé hodnoty.
Příklad 2 – Oddíly
Výsledky můžete také rozdělit do oddílů. Když to uděláte, hodnocení se vypočítá pro každý oddíl (takže s každým novým oddílem začíná znovu).
Příklad:
SELECT Genre, AlbumName, ArtistId, DENSE_RANK() OVER (PARTITION BY Genre ORDER BY ArtistId ASC) 'Rank' FROM Albums INNER JOIN Genres ON Albums.GenreId = Genres.GenreId;
Výsledek:
+---------+--------------------------+------------+--------+ | Genre | AlbumName | ArtistId | Rank | |---------+--------------------------+------------+--------| | Country | Singing Down the Lane | 6 | 1 | | Country | Yo Wassup | 9 | 2 | | Country | Busted | 9 | 2 | | Jazz | All Night Wrong | 3 | 1 | | Jazz | The Sixteen Men of Tain | 3 | 1 | | Jazz | Big Swing Face | 4 | 2 | | Pop | Long Lost Suitcase | 7 | 1 | | Pop | Praise and Blame | 7 | 1 | | Pop | Along Came Jones | 7 | 1 | | Pop | No Sound Without Silence | 9 | 2 | | Pop | Blue Night | 12 | 3 | | Pop | Eternity | 12 | 3 | | Pop | Scandinavia | 12 | 3 | | Rock | Powerslave | 1 | 1 | | Rock | Somewhere in Time | 1 | 1 | | Rock | Piece of Mind | 1 | 1 | | Rock | Killers | 1 | 1 | | Rock | No Prayer for the Dying | 1 | 1 | | Rock | Powerage | 2 | 2 | | Rock | Ziltoid the Omniscient | 5 | 3 | | Rock | Casualties of Cool | 5 | 3 | | Rock | Epicloud | 5 | 3 | +---------+--------------------------+------------+--------+
V tomto případě rozděluji podle žánru. To způsobí, že každý řádek bude hodnocen pouze proti ostatním řádkům ve stejném oddílu. Každý oddíl tedy způsobí, že hodnota hodnocení začne znovu na 1.
Příklad 3 – Příklad hodnotící tabulky
Zde je možný případ použití pro zobrazení hodnocení uživateli.
SELECT Player, Score, DENSE_RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
Výsledek:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Bart | 2010 | 1 | | Burns | 1270 | 2 | | Meg | 1030 | 3 | | Marge | 990 | 4 | | Lisa | 710 | 5 | | Ned | 666 | 6 | | Apu | 350 | 7 | | Homer | 1 | 8 | +----------+---------+--------+
Mějte na paměti, že žádné nerozhodné výsledky neovlivní následující pořadí. Jinými slovy, v hodnotě pořadí nebudou žádné mezery.
Nejlépe to pravděpodobně vysvětlí příklad:
SELECT Player, Score, DENSE_RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
Výsledek:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Lisa | 2010 | 1 | | Bart | 2010 | 1 | | Burns | 1270 | 2 | | Meg | 1030 | 3 | | Marge | 990 | 4 | | Ned | 666 | 5 | | Apu | 350 | 6 | | Homer | 1 | 7 | +----------+---------+--------+
V tomto případě jsou Lisa a Bart nerozhodně na čísle 1. Poté přichází Burns na druhém místě (i když je třetí osobou).
Pokud dáváte přednost tomu, aby se Burns v tomto případě umístil na 3. místě (a Meg na 4. atd.), použijte RANK()
místo toho funkci.
Příklad 4 – Nahrazení DENSE_RANK() za RANK()
Zde je znovu stejný příklad, ale tentokrát používám RANK()
:
SELECT Player, Score, RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
Výsledek:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Lisa | 2010 | 1 | | Bart | 2010 | 1 | | Burns | 1270 | 3 | | Meg | 1030 | 4 | | Marge | 990 | 5 | | Ned | 666 | 6 | | Apu | 350 | 7 | | Homer | 1 | 8 | +----------+---------+--------+