Функція RANK у SQL Server є різновидом функції ранжирування. Ця функція буде призначити номер кожному рядку в розділі виводу . Він призначає ранг кожному рядку як один плюс ранг попереднього рядка. Коли функція RANK знаходить два ідентичних значення в одному розділі, вона призначає їм однаковий номер рангу. Крім того, наступний номер у рейтингу буде попереднім рангом плюс повторювані номери. Тому ця функція не завжди призначає ранжування рядків у послідовному порядку.
Функція RANK також є підчастиною віконних функцій. Під час використання цієї функції слід пам’ятати наступні моменти :
- Він завжди працює з пропозицією OVER().
- Він призначає ранг кожному рядку на основі пропозиції ORDER BY.
- Він призначає ранг кожному рядку в послідовному порядку.
- Він завжди призначає ранг рядкам, починаючи з одного для кожного нового розділу.
ПРИМІТКА. Ранг призначає тимчасові значення для рядків у розділі під час виконання запиту.
SQL Server надає наступні функції рангу :
- RANK()
- 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:
replaceall у рядку java
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
У цьому синтаксисі
- The речення OVER встановлює розділення та впорядкування результату перед застосуванням відповідної віконної функції.
- The Речення PARTITION BY розділяє вихідні дані, створені пропозицією FROM, на розділ. Потім функція застосовується до кожного розділу та повторно ініціалізується, коли межа розділення перетинає розділи. Якщо ми не визначили цей пункт, функція розглядатиме всі рядки як єдиний розділ.
- The СОРТУВАТИ ЗА є обов’язковим пунктом, який визначає порядок рядків за спаданням або зростанням на основі одного або кількох імен стовпців перед застосуванням функції.
приклад
Давайте подивимося, як працює функція RANK() у SQL Server. У наведеному нижче операторі буде використано функцію rank для призначення нумерації кожному рядку:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Оскільки ми не використовували Речення PARTITION BY , функція розглядала весь результат як один розділ. Виконання оператора призведе до наступного результату:
У цьому виході ми бачимо, що деякі рядки мають однаковий ранг, оскільки вони мають однакове значення в міська колона . І наступний номер у рейтингу буде його попереднім рангом плюс кількість повторюваних номерів.
Наступне твердження інший приклад де ми збираємося використовувати пропозицію 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().
зависання в css
Наведений нижче синтаксис ілюструє використання функції 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. Це положення розділить рядки на основі стовпця city, а порядок набору результатів базується на first_name:
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, на різних прикладах. Також показано основні відмінності між цими функціями. Ці функції дуже корисні розробникам для вивчення та ефективного керування своїми даними.