При работе с данными существует фундаментальная необходимость категоризировать или ранжировать различные записи. Например, вы можете ранжировать команды по их баллам, сотрудников по их зарплате и т.д.
Большинство из нас выполняет вычисления, используя функции, которые возвращают одно значение. В этой статье мы рассмотрим, как использовать функцию ранжирования SQL Server для возврата совокупного значения для определенной группы строк.
Функция rank() является частью оконных функций SQL Server. Он работает, присваивая ранг каждой строке для определенного раздела результирующего набора.
Функция присваивает одинаковое значение ранга строкам в аналогичном разделе. Он присваивает первому рангу значение 1 и добавляет последовательное значение к каждому рангу.
Синтаксис функции ранга следующий:
rank OVER ( [partition BY expression], ORDER BY expression [ASC|DESC
Давайте разберем приведенный выше синтаксис.
Предложение partition by делит строки на определенные разделы, к которым применяется функция ранжирования. Например, в базе данных, содержащей данные о сотрудниках, вы можете разбить строки на основе отделов, в которых они работают.
Следующее предложение, ORDER BY, определяет порядок, в котором строки организованы в указанных разделах.
Давайте возьмем практический пример, чтобы понять, как использовать функцию rank() в SQL Server.
Начните с создания примера таблицы, содержащей информацию о сотрудниках.
CREATE TABLE developers( id INT IDENTITY(1,1), NOT a NULL PRIMARY KEY, name VARCHAR(200) NOT NULL, department VARCHAR(50), salary money );
INSERT INTO developers(name, department, salary) VALUES ('AndreyEx', 'Game Developer',230000 ), ('Maxim', 'Mobile Developer', 111000), ('Alex', 'DevOps Developer', 120000), ('Maria', 'Mobile Developer', 1109000), ('Dany', 'Full-Stack Developer' 2102000), SELECT * FROM developers;
У вас должна быть таблица с записями.
Используйте функцию ранга, чтобы присвоить ранги данным. Пример запроса выглядит следующим образом:
SELECT *, rank() OVER (ORDER BY department) AS rank_number FROM developers;
Вывод выше показывает, что функция присвоила строкам из похожих отделов одинаковое значение ранга. Обратите внимание, что функция пропускает некоторые значения ранга в зависимости от количества значений, имеющих одинаковый ранг.
Например, с ранга 7 функция переходит на ранг 10, поскольку ранги 8 и 9 присваиваются двум последовательным значениям ранга 7.
Рассмотрим пример ниже. Он использует функцию ранга для присвоения ранга разработчикам в том же отделе.
SELECT *, rank() OVER (partition BY department ORDER BY salary DESC) AS rank_number FROM developers;
Вышеупомянутый запрос начинается с разделения строк в соответствии с их отделами. Затем предложение order by сортирует записи в каждом разделе по зарплате в порядке убывания.
В этой статье мы рассмотрели, как работать с функцией ранжирования в SQL Server, что позволяет вам разделять и ранжировать строки.