RANK、DENSE_RANK与FIRST_VALUE函数的区别及适用场景问询
RANK、DENSE_RANK与FIRST_VALUE的理解纠正及FIRST_VALUE业务场景
一、你的理解纠正
结合你提供的查询结果,你的部分理解存在偏差:
- DENSE_RANK:理解正确。从query1的输出可见,Emma和Mia分数并列,均被分配rank2,Lucas的rank为3(无名次跳跃),符合“并列值分配相同排名,后续排名连续递增”的逻辑。
- RANK:你的理解错误。从query2的输出能看到,Emma和Mia同样被分配rank2(并列值享有相同排名),但Lucas的rank直接跳到4——RANK的规则是并列值会占用对应名次数量,后续名次会跳过这些被占用的位置。
- FIRST_VALUE:你的理解不准确。它的核心是返回窗口内按指定排序规则排列后的第一个值,并非仅选取最大值。比如若你将OVER子句改为
ORDER BY score ASC,它就会返回分数最低的学生(John或Oliver,取决于数据库的平局排序规则),而非最高分的Sophia。你的query3返回Sophia,只是因为你按score降序排序,第一个值恰好是最高分的学生。
二、FIRST_VALUE的常见业务场景
- 业绩基准对比:在销售数据中,为每个业务员的业绩行添加同区域内Top业绩业务员的姓名/业绩值,方便业务员直观对比自身与Top的差距。
- 分组首项关联:按月份分组的订单数据中,将每个月第一笔订单的客户信息(如客户等级、来源渠道)显示在该月所有订单行中,便于分析当月订单的起始特征。
- 优先级提醒:在工单系统中,按紧急程度降序排序后,用FIRST_VALUE取出当前队列中最紧急的工单编号,所有工单行都显示这个最高优先级工单,提醒处理人员优先关注。
- 缺失值填充:同一用户的多条记录中,若部分行缺失关键信息(如手机号),可用该用户最早创建的记录中的手机号(通过
ORDER BY create_time ASC取FIRST_VALUE)填充缺失行。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

