跳到主要内容

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) 的第四组人最多?" → 余数分配给后面的桶

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看