sql >> Databáze >  >> RDS >> Sqlserver

Jak funguje DENSE_RANK() v SQL Server

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 > )

je volitelný. Rozdělí výslednou sadu vytvořenou 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.

je požadováno. Určuje pořadí, ve kterém se funkce použije na řádky v oddílu.

Všimněte si, že OVER klauzule normálně přijímá , ale tento argument nelze s touto funkcí použít.

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      |
+----------+---------+--------+

  1. Jak nainstalovat MySQL na Windows 10? – Vaše jediné řešení pro instalaci MySQL

  2. Tipy pro migraci z replikace MySQL na MySQL Galera Cluster 4.0

  3. Jak CHR() funguje v MariaDB

  4. Nastavte PDO tak, aby ve výchozím nastavení vyvolávalo výjimky