导读:本期聚焦于小伙伴创作的《SQL窗口函数ROW_NUMBER、RANK、DENSE_RANK和NTILE分别适合哪些业务场景?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL窗口函数ROW_NUMBER、RANK、DENSE_RANK和NTILE分别适合哪些业务场景?》有用,将其分享出去将是对创作者最好的鼓励。

SQL窗口函数中的ROW_NUMBER、RANK、DENSE_RANK和NTILE都属于排序类窗口函数,但在业务含义上有明显区别。理解它们各自适合的场景,可以帮助我们在写分析SQL时快速选型,而不必每次都临时推导逻辑。

SQL窗口函数ROW_NUMBER、RANK、DENSE_RANK和NTILE分别适合哪些业务场景?

一、ROW_NUMBER:分组内唯一序号,适合去重与取第一条

ROW_NUMBER在不考虑并列的情况下,为每一行分配一个连续且不重复的数字。典型业务场景是取每个用户最近一笔订单,或剔除完全重复的记录。

-- 取每个用户最近的一笔订单
SELECT user_id, order_id, create_time
FROM (
  SELECT
    user_id,
    order_id,
    create_time,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS rn
  FROM orders
) t
WHERE rn = 1;

二、RANK与DENSE_RANK:排名场景下的并列处理

RANK会在出现并列时跳过后续名次,而DENSE_RANK不会跳过。例如成绩排名中,两个并列第一后,RANK的下一名是第三,DENSE_RANK的下一名是第二。

分数RANKDENSE_RANK
10011
10011
9032
-- 查询学生成绩排名,展示两种排名差异
SELECT
  student_name,
  score,
  RANK() OVER (ORDER BY score DESC) AS rk,
  DENSE_RANK() OVER (ORDER BY score DESC) AS drk
FROM exam_score;

业务模板建议

  • 需要名次间断(如竞赛颁奖):使用RANK
  • 需要连续等级(如会员分级):使用DENSE_RANK

三、NTILE:等频分桶,适合用户分层

NTILE可以把有序数据切成N个桶,每个桶行数尽量相等。常用于将用户按消费额分为高、中、低三组,或做四分位分析。

-- 将用户按消费金额分为4组
SELECT
  user_id,
  total_amount,
  NTILE(4) OVER (ORDER BY total_amount DESC) AS level_bucket
FROM user_consumption;

四、综合对比与选型

当需求是“每组取前N条且不允许并列占多行”时,优先ROW_NUMBER;当需求是“展示排名且并列合理”时,根据是否跳号选择RANK或DENSE_RANK;当需求是“把数据均匀分段”时,使用NTILE。把这些模板存入常用SQL片段,业务开发效率会明显提升。

注意:窗口函数不会减少原表行数,只是新增计算列,过滤需在子查询或外层WHERE中完成。

SQL窗口函数ROW_NUMBERRANK修改时间:2026-07-26 16:57:17

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。