SQL窗口函数-RANK() 函数的解释和用法

1. 基本语法

RANK() OVER (PARTITION BY <column_name> ORDER BY <column_name> ASC|DESC)
  • PARTITION BY:如果你想按照某一列对数据进行分区,可以使用 PARTITION BY。每个分区内的数据排名将从 1 开始。如果不使用 PARTITION BY,则排名会在整个结果集上生成。
  • ORDER BY:决定排名的顺序,通常是基于某个列的升序(ASC)或降序(DESC)来排序。

2. 关键点:

  • RANK() 会对相同的值赋予相同的排名,并且会跳过后续的排名。例如,如果两个值并列第一,那么接下来的排名会跳到第三位,而不是第二位。
  • 它与 ROW_NUMBER() 不同,后者不会跳过排名。

3. 更详细的示例:

假设我们有一个员工销售成绩表,包含以下字段:

我们将展示如何使用 RANK() 来按销售额为员工排名。

4. 示例 1:简单的 RANK() 排名

SELECT EmployeeName, SalesAmount,
       RANK() OVER (ORDER BY SalesAmount DESC) AS Rank
FROM Sales;

解释:

  • 我们按照 SalesAmount 的降序来排序。
  • RANK() 会为每一行分配一个排名。

结果:

说明:

  • Eve 的销售额最大,所以她的排名是 1。
  • BobCarol 的销售额相同,所以他们都获得了排名 2。接下来,排名跳到 4,而不是 3。
  • AliceDave 的销售额分别为 1000 和 500,他们分别排在 4 和 5。

5. 示例 2:使用 PARTITION BY 分区排名

如果你希望按部门对员工进行分区并在每个部门内进行排名,你可以使用 PARTITION BY

假设我们的表格现在多了一个 Department 字段:

你可以按部门(Department)分区并排名:

SELECT EmployeeName, Department, SalesAmount,
       RANK() OVER (PARTITION BY Department ORDER BY SalesAmount DESC) AS Rank
FROM Sales;

结果:

     

说明:

  • RANK() 会在每个部门内独立排名。
  • HR 部门中,Alice 排名第一,Dave 排名第二。
  • Sales 部门中,Eve 排名第一,BobCarol 排名第二。

6. 总结

  • RANK() 可以用于为结果集中的数据排序并生成排名。
  • 对于重复的值,它会分配相同的排名,但跳过后续排名。
  • PARTITION BY 使得可以在分组后单独生成排名,适用于按不同类别进行排名的场景。

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值