返回

SQL高手带你了解row_number()、rank()、DENSE_RANK()三大开窗函数

后端

开窗函数的威力:使用 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() 函数考虑并列排名。

常见问题解答

  1. 什么时候使用 row_number() 函数?
    答:当需要为数据添加行号时。

  2. 什么时候使用 rank() 函数?
    答:当需要对数据进行排名时。

  3. 什么时候使用 DENSE_RANK() 函数?
    答:当需要对数据进行排名但不考虑并列排名时。

  4. 这三个函数之间的主要区别是什么?
    答:row_number() 返回行号,rank() 返回排名,DENSE_RANK() 返回不考虑并列排名的排名。

  5. 这些函数可以在哪些数据库中使用?
    答:row_number()、rank()DENSE_RANK() 函数在大多数主流数据库中都可用,如 MySQL、PostgreSQL、Oracle 和 SQL Server。