SQL RANK函数
RANK是标准查询语言(SQL)中的一个分析函数或窗口函数,根据查询运行时指定的列的值,指示结果集中每一行的位置。
RANK函数用于对表中的数据进行排名,例如,基于百分比对学生的位置进行排名,基于工资对员工的位置进行排名等。
进行排名时,它为每一行输出的行分配一个数字。排名按顺序提供,即1、2、3、4等。如果行相同,则RANK()函数为多个行提供相同的排名;例如,如果两个学生获得相同的百分比,它们将同时获得相同的排名。
在使用排名函数时需要注意的事项如下:
- 使用OVER()子句是强制性的,因为RANK()函数与OVER()子句一起使用。
- 它根据ORDER BY子句对每一行进行排名。
- 它为每个新的分区从整数1开始对行进行排名。
- 它按顺序为每一行分配排名,即1、2、3、4等。
- 如果有多行相同,它会为这些行分配相同的排名。但在这种情况下,下一个不相等的行会通过在前一个排名中添加重复行的数量来获得排名。
下面是在SQL中使用RANK()函数的语法:
SELECT *,
RANK()OVER(
PARTITION BY column_name
ORDER BY column_name [ASC/DESC])
AS 'Position'
FROM table_name;
在上述语法中,
- RANK()函数与OVER()子句一起使用。
- PARTITION BY子句将FROM子句获得的输出拆分成分区。不必使用此PARTITION BY子句。
- ORDER BY子句用于根据列名按降序或升序排列行的顺序。
在标准查询语言(SQL)中有各种等级函数,如下所示:
- RANK()
- ROW_NUMBER()
- DENSE_RANK()
- NTILE()
我们将逐个讨论它们并附上示例。
RANK函数的示例:
首先,我们将创建一个我们将要操作的示例表。
我们将创建一个名为student_table的表,包含stu_name,stu_age,stu_address,stu_subject和stu_marks的详细信息。
创建表:
下面的代码将创建一个空表。
CREATE TABLE student_table(
stu_name varchar(30),
stu_age int,
stu_address varchar(30),
stu_subject varchar(30),
stu_marks int
);
一个空表看起来如下所示。
将数据插入表格:
下面给出的代码将插入数据到表格中。
INSERT INTO student_table
VALUES
('Anthony',20,' Austin', 'AI', 82),
('James', 20, 'Chicago', 'DAA', 82),
('Helen', 21, 'Phoenix', 'EC', 75),
('Nicole', 19, 'Chicago', 'DAA', 73),
('Daniel', 22, 'Columbus', 'AI', 85),
('Shirley', 21, 'Austin', 'DAA', 86),
('Peter', 22, 'Phoenix', 'AI', 72),
('John', 23, 'Washington', 'DAA', 89),
('Nick', 23, 'Columbus', 'EC', 73),
('Ashley', 21, 'Washington', 'DBMS', 71);
SELECT * FROM student_table;
如您所见,数据已经插入,表格看起来像这样:
stu_name | stu_age | stu_address | stu_subject | stu_marks |
---|---|---|---|---|
Anthony | 20 | Austin | AI | 82 |
James | 20 | Chicago | DAA | 82 |
Helen | 21 | Phoenix | EC | 75 |
Nicole | 19 | Chicago | DAA | 73 |
Daniel | 22 | Columbus | AI | 85 |
Shirley | 21 | Austin | DAA | 86 |
Peter | 22 | Phoenix | AI | 72 |
John | 23 | Washington | DAA | 89 |
Nick | 23 | Columbus | EC | 73 |
Ashley | 21 | Washington | DBMS | 71 |
例1:在SQL中使用无PARTITION BY子句的RANK()函数
在这个例子中,我们将根据学生的分数对他们进行排名。为了做到这一点,我们将使用下面的代码。
输入:
SELECT *,
RANK() OVER(
ORDER BY stu_marks DESC)
AS 'Position'
FROM student_table;
输出:
正如您在输出中所看到的那样,学生们根据他们的分数被给予一个排名。拥有相同分数的学生被给予相同的排名,但在此之后,通过在先前排名中添加重复项的个数来给下一个学生排名。
stu_name | stu_age | stu_address | stu_subject | stu_marks | Position |
---|---|---|---|---|---|
John | 23 | Washington | DAA | 89 | 1 |
Shirley | 21 | Austin | DAA | 86 | 2 |
Daniel | 22 | Columbus | AI | 85 | 3 |
Anthony | 20 | Austin | AI | 82 | 4 |
James | 20 | Chicago | DAA | 82 | 4 |
Helen | 21 | Phoenix | EC | 75 | 6 |
Nicole | 19 | Chicago | DAA | 73 | 7 |
Nick | 23 | Columbus | EC | 73 | 7 |
Peter | 22 | Phoenix | AI | 72 | 9 |
Ashley | 21 | Washington | DBMS | 71 | 10 |
示例2:使用PARTITION BY子句在SQL中使用RANK()函数
在这个示例中,我们将使用PARTITION BY子句将科目分为分区,然后我们将根据分数的降序给学生排名,使用ORDER BY子句。
我们将使用下面的代码给学生排名,
输入:
SELECT *,
RANK() OVER(
PARTITION BY stu_subject
ORDER BY stu_marks DESC)
AS 'Position'
FROM student_table;
输出:
正如你在输出中所看到的,学生们根据他们的分数按科目排名。
stu_name | stu_age | stu_address | stu_subject | stu_marks | Position |
---|---|---|---|---|---|
Daniel | 22 | Columbus | AI | 85 | 1 |
Anthony | 20 | Austin | AI | 82 | 2 |
Peter | 22 | Phoenix | AI | 72 | 3 |
John | 23 | Washington | DAA | 89 | 1 |
Shirley | 21 | Austin | DAA | 86 | 2 |
James | 20 | Chicago | DAA | 82 | 3 |
Nicole | 19 | Chicago | DAA | 73 | 4 |
Ashley | 21 | Washington | DBMS | 71 | 1 |
Helen | 21 | Phoenix | EC | 75 | 1 |
Nick | 23 | Columbus | EC | 73 | 2 |
示例3:SQL中的ROW_NUMBER() RANK函数
在这个例子中,我们将了解如何使用ROW_NUMBER() RANK函数。
ROW_NUMBER()为每一行提供一个唯一的排名,这意味着即使两个学生的分数相同,它们也会得到一个唯一的排名。ROW_NUMBER()函数的语法与RANK()函数几乎完全相同。
下面给出的代码将展示ROW_NUMBER()函数的使用示例-
输入:
SELECT *,
ROW_NUMBER() OVER(
ORDER BY stu_marks DESC)
AS 'Position'
FROM student_table;
输出:
如您在输出中所见,每一行都被分配了不同的等级。
stu_name | stu_age | stu_address | stu_subject | stu_marks | Position |
---|---|---|---|---|---|
John | 23 | Washington | DAA | 89 | 1 |
Shirley | 21 | Austin | DAA | 86 | 2 |
Daniel | 22 | Columbus | AI | 85 | 3 |
Anthony | 20 | Austin | AI | 82 | 4 |
James | 20 | Chicago | DAA | 82 | 5 |
Helen | 21 | Phoenix | EC | 75 | 6 |
Nicole | 19 | Chicago | DAA | 73 | 7 |
Nick | 23 | Columbus | EC | 73 | 8 |
Peter | 22 | Phoenix | AI | 72 | 9 |
Ashley | 21 | Washington | DBMS | 71 | 10 |
示例4:SQL中的DENSE_RANK()函数
在这个例子中,我们将理解如何使用DENSE_RANK()函数。
DENSE_RANK()函数用于给每行分配一个唯一的排名。如果两个学生的分数相同,它会给它们分配相同的排名。DENSE_RANK()函数的语法与RANK()函数的语法几乎相同。下面的代码将展示DENSE_RANK()函数的用法-
输入:
SELECT *,
DENSE_RANK() OVER(
ORDER BY stu_marks DESC)
AS 'Position'
FROM student_table;
输出:
输出明确显示,当学生在相同的分数下获得相同的排名时,不会跳过下一个排名。相反,它会提供下一个连续的整数。
stu_name | stu_age | stu_address | stu_subject | stu_marks | Position |
---|---|---|---|---|---|
John | 23 | Washington | DAA | 89 | 1 |
Shirley | 21 | Austin | DAA | 86 | 2 |
Daniel | 22 | Columbus | AI | 85 | 3 |
Anthony | 20 | Austin | AI | 82 | 4 |
James | 20 | Chicago | DAA | 82 | 4 |
Helen | 21 | Phoenix | EC | 75 | 5 |
Nicole | 19 | Chicago | DAA | 73 | 6 |
Nick | 23 | Columbus | EC | 73 | 6 |
Peter | 22 | Phoenix | AI | 72 | 7 |
Ashley | 21 | Washington | DBMS | 71 | 8 |
示例5:SQL中的NTILE(N) RANK函数
在这个示例中,我们将学习如何使用NLITE(N) RANK函数。
NTILE(N)将行分成多个组,并为每一行分配一个组号。’N’代表组的数量。NLITE(N)函数的语法与RANK()函数几乎相同。
下面给出的代码将展示NTILE(N)函数的使用方法-
输入:
SELECT *,
NTILE(N) OVER(
ORDER BY stu_marks DESC)
AS 'Group'
FROM student_table;
输出:
从输出可以看出,这些行被分成了三组。
stu_name | stu_age | stu_address | stu_subject | stu_marks | Group |
---|---|---|---|---|---|
John | 23 | Washington | DAA | 89 | 1 |
Shirley | 21 | Austin | DAA | 86 | 1 |
Daniel | 22 | Columbus | AI | 85 | 1 |
Anthony | 20 | Austin | AI | 82 | 1 |
James | 20 | Chicago | DAA | 82 | 2 |
Helen | 21 | Phoenix | EC | 75 | 2 |
Nicole | 19 | Chicago | DAA | 73 | 2 |
Nick | 23 | Columbus | EC | 73 | 3 |
Peter | 22 | Phoenix | AI | 72 | 3 |
Ashley | 21 | Washington | DBMS | 71 | 3 |
结论:
在本篇文章中,您已经学到了有关SQL RANK函数的知识,以及各种示例。它是一种为表中的每一行分配排名的函数。您还学习了不同的排名函数,包括DENSE_RANK()、ROW_NUMBER()、RANK()和NTILE(N)排名函数。