SQL高手带你了解row_number()、rank()、DENSE_RANK()三大开窗函数
2023-08-19 23:10:08
开窗函数的威力:使用 row_number()、rank() 和 DENSE_RANK() 函数对数据进行排序和排名
在数据分析的世界中,对数据进行排序和排名至关重要,它可以帮助我们从数据中提取有价值的见解。而开窗函数就是完成这项任务的强大工具。row_number()、rank() 和 DENSE_RANK() 函数是三种常用的开窗函数,它们可以帮助我们根据指定的规则为数据行分配行号和排名。
row_number() 函数:为数据添加行号
row_number() 函数返回指定行在当前窗口中的行号。窗口由 ORDER BY 子句定义,默认情况下是升序。这个函数非常适合为数据添加行号,以便以后进行引用或处理。
SELECT row_number() OVER (ORDER BY id) AS row_num,
name,
salary
FROM employees;
结果:
row_num | name | salary |
---|---|---|
1 | John Doe | 1000 |
2 | Jane Smith | 2000 |
3 | Michael Jones | 3000 |
rank() 函数:对数据进行排名
rank() 函数返回指定行在当前窗口中的排名。排名是基于 ORDER BY 子句指定的排序规则。这个函数通常用于对数据进行排名,以便以后进行比较或选择。
SELECT rank() OVER (ORDER BY salary) AS rank,
name,
salary
FROM employees;
结果:
rank | name | salary |
---|---|---|
1 | Michael Jones | 3000 |
2 | Jane Smith | 2000 |
3 | John Doe | 1000 |
DENSE_RANK() 函数:对数据进行排名,不考虑并列
DENSE_RANK() 函数与 rank() 函数类似,但它不考虑并列排名。也就是说,如果有多个行具有相同的排名,DENSE_RANK() 函数将为它们分配相同的排名。这个函数通常用于对数据进行排名,以便以后进行比较或选择。
SELECT DENSE_RANK() OVER (ORDER BY salary) AS dense_rank,
name,
salary
FROM employees;
结果:
dense_rank | name | salary |
---|---|---|
1 | Michael Jones | 3000 |
2 | Jane Smith | 2000 |
3 | John Doe | 1000 |
区别和联系
- row_number() 函数返回行号,而 rank() 和 DENSE_RANK() 函数返回排名。
- rank() 和 DENSE_RANK() 函数基于排序规则进行排名,而 row_number() 函数不考虑排序规则。
- DENSE_RANK() 函数不考虑并列排名,而 rank() 函数考虑并列排名。
常见问题解答
-
什么时候使用 row_number() 函数?
答:当需要为数据添加行号时。 -
什么时候使用 rank() 函数?
答:当需要对数据进行排名时。 -
什么时候使用 DENSE_RANK() 函数?
答:当需要对数据进行排名但不考虑并列排名时。 -
这三个函数之间的主要区别是什么?
答:row_number() 返回行号,rank() 返回排名,DENSE_RANK() 返回不考虑并列排名的排名。 -
这些函数可以在哪些数据库中使用?
答:row_number()、rank() 和 DENSE_RANK() 函数在大多数主流数据库中都可用,如 MySQL、PostgreSQL、Oracle 和 SQL Server。