NTILE 窗口函数详解
一、一句话理解
NTILE(n) 将数据均匀分成 n 个桶,每行获得自己所属的桶编号(1 到 n)。
二、函数语法
NTILE(n) OVER (PARTITION BY 分组列 ORDER BY 排序列)
三、真实业务场景
场景1:按成绩把学生分成 3 个等级
将学生按成绩从高到低分成 3 组:前1/3(A组)、中1/3(B组)、后1/3(C组)。
SELECT name, score,
NTILE(3) OVER (ORDER BY score DESC) AS grade_group
FROM students;
10 个学生分成 3 组:
成绩排序: 100,95,90, 88,85,80, 75,70,60,55
└─第1组─┘ └─第2组─┘ └──第3组──┘
分组结果: 1, 1, 1, 2, 2, 2, 3, 3, 3, 3
注意:10 ÷ 3 不能整除,前 2 组各 3 人,第 3 组 4 人。NTILE 会把多余的行分配给编号更大的桶。
场景2:按消费金额把用户分层
将每个城市的用户按消费金额分成 4 层(高/中高/中/低)。
SELECT city, user_id, amount,
NTILE(4) OVER (PARTITION BY city ORDER BY amount DESC) AS user_tier
FROM orders;
四、常见坑点
坑1:不能整除时的分配
10 行分 3 组 → 每组 3,3,4。如果要求"前30%",NTILE(3) 给第一组 3人 = 30%,恰好对;但如果 11 行分 3 组 → 4,4,3,第一组反而 4 人=36%,就不精确了。
坑2:NTILE 与 PERCENT_RANK 的区别
NTILE 按行数均分,PERCENT_RANK 按值排名计算。两者在数据均匀分布时结果相似,在数据倾斜时差异很大。
五、面试怎么考
- "怎么把数据均匀分成 N 组?" → NTILE
- "NTILE 和 ROW_NUMBER 有什么区别?" → NTILE 是分组编号,ROW_NUMBER 是行编号
- "为什么 NTILE(4) 的第四组人最多?" → 余数分配给后面的桶
七、相关面试题
- 03. 物流时效统计 — NTILE 分段统计
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
