Функцията RANK в SQL Server е вид функция за класиране. Тази функция ще присвояване на номера на всеки ред в рамките на дяла на изход . Той присвоява ранга на всеки ред като едно плюс ранга на предишния ред. Когато функцията RANK намери две идентични стойности в рамките на един и същи дял, тя им присвоява един и същ номер на ранг. В допълнение, следващият номер в класирането ще бъде предишният ранг плюс дублиращи се номера. Следователно тази функция не винаги присвоява класирането на редовете в последователен ред.
Функцията RANK също е подчаст от функциите на прозореца. Когато използвате тази функция, трябва да запомните следните точки :
- Винаги работи с клаузата OVER().
- Той присвоява ранг на всеки ред въз основа на клаузата ORDER BY.
- Той присвоява ранг на всеки ред в последователен ред.
- Той винаги присвоява ранг на редове, започвайки с един за всеки нов дял.
ЗАБЕЛЕЖКА: Рангът присвоява временни стойности за редове в рамките на дяла, когато заявката се изпълнява.
SQL Server предоставя следните функции за ранг :
- РАНГ()
- ROW_NUMBER()
- DENSE_RANK()
- NTILE()
Нека научим подробно всяка функция за ранг. Първо, ще създадем таблица за демонстрация на всички тези функции. Следните изрази създават таблица с име rank_demo с три колони:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
След това ще вмъкнем няколко реда в тази таблица, както е показано по-долу:
INSERT INTO rank_demo (first_name, last_name, city) VALUES ('Luisa', 'Evans', 'Texas'), ('Paul', 'Ward', 'Alaska'), ('Peter', 'Bennett', 'California'), ('Carlos', 'Patterson', 'New York'), ('Rose', 'Huges', 'Florida'), ('Marielia', 'Simmons', 'Texas'), ('Antonio', 'Butler', 'New York'), ('Diego', 'Cox', 'California');
Можем да проверим таблицата с помощта на израза SELECT. Той показва изхода по-долу:
Функция RANK().
Тази функция се използва за определяне на ранга за всеки ред в набора от резултати. Следният синтаксис илюстрира използването на функция RANK в SQL Server:
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
В този синтаксис,
- The клауза НАД задава разделянето и подреждането на резултат, преди да се приложи свързаната функция за прозорец.
- The Клауза PARTITION BY разделя изхода, произведен от клаузата FROM, в дяла. След това функцията се прилага към всеки дял и се инициализира отново, когато границата на разделението пресича дялове. Ако не сме дефинирали тази клауза, функцията ще третира всички редове като един дял.
- The ПОДРЕДЕНИ ПО е задължителна клауза, която определя реда на редовете по низходящ или възходящ начин въз основа на едно или повече имена на колони, преди функцията да бъде приложена.
Пример
Нека видим как работи функцията RANK() в SQL Server. Изявлението по-долу ще използва функцията за ранг, за да присвои номериране за всеки ред:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Тъй като не сме използвали Клауза PARTITION BY , функцията третира целия резултат като един дял. Изпълнението на оператора ще покаже изхода по-долу:
В този изход можем да видим, че някои от редовете получават същия ранг, защото имат една и съща стойност в градска колона . И следващият номер в класацията ще бъде неговият предишен ранг плюс редица дублиращи се числа.
частично производен латекс
Следното твърдение е друг пример където ще използваме клауза за дял, която ще разделя редовете въз основа на град колона и задайте класиране на всеки ред в дял. Редът на изхода се основава на първо име :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
Той ще покаже изхода по-долу:
Функция ROW_NUMBER().
Тази функция се използва за връща уникалния пореден номер за всеки ред в рамките на неговия дял. Номерирането на редовете започва от един и се увеличава с един, докато се достигне общият брой редове на дяла. Той ще върне различните рангове за реда с подобни стойности, които го правят различен от функцията RANK().
Синтаксисът по-долу илюстрира използването на функция ROW_NUMBER() в SQL Server:
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Пример
Изпълнете следната заявка, за да зададете пореден номер за всеки ред:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Той ще определи класирането за таблицата според тях град . Тук можем да видим, че присвоява различни рангове за реда, който има еднакви градски стойности.
Ако променим реда на сортиране от възходящ към низходящ с клаузата ORDER BY, тази функция също ще промени съответно RANK. Вижте изявлението по-долу:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
Ето резултата:
Функция DENSE_RANK().
Тази функция присвоява уникален ранг за всеки ред в дял според указаната стойност на колоната без пропуски. Винаги определя класирането в последователен ред. Ако получим a дублирана стойност , тази функция ще му присвои същия ранг, като следващият ранг ще бъде следващият пореден номер. Тази характеристика различава функцията DENSE_RANK() от функцията RANK().
Синтаксисът по-долу илюстрира използването на функция DENSE_RANK() в SQL Server:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Пример
Следната заявка използва функцията DENSE_RANK(), за да присвои номер на ранг за всеки ред:
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Той ще върне изхода по-долу, където можем да видим, че дублиращите се стойности имат еднакъв ранг, а следващият ранг ще бъде следващият пореден номер.
Това е друг пример за функцията DENSE_RANK() чрез използване на клаузата PARTITION BY. Тази клауза ще раздели редовете въз основа на колоната за град, а редът на набор от резултати се основава на first_name:
ред на фибоначи в java
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
Ще получим резултата по-долу, защото няма две еднакви имена. В този случай изходът е подобен на функцията RANK().
Нека актуализираме името със следната заявка:
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
Сега изпълнете същата заявка отново. Ще видим, че тази таблица е получила същото име Калифорния Сити . Следователно рангът е еднакъв и за двете имена.
Функция NTILE(N).
Тази функция се използва за разпределете редове от подреден дял в предварително определен брой (N) от приблизително равни групи. Всяка група редове получава своя ранг въз основа на дефинираното условие и започва номерирането от една група. Той присвоява a номер на кофата за всеки ред в група, представляваща групата, към която принадлежи.
Следният синтаксис илюстрира използването на функция NTILE() в SQL Server:
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Пример
Следната заявка използва функцията NTILE(), за да присвои номер на ранг за всеки ред:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
Посочената таблица има осем записа . Следователно, на NTILE (3) казва, че наборът от резултати трябва да има a група от три записа . Изпълнението на оператора ще покаже изхода по-долу:
Тази статия ще обясни всички RANK функции, използвани в SQL Server с различни примери. Той също така показва основните разлики между тези функции. Тези функции са много полезни за разработчиците за проучване и управление на данните им.