使用 NTILE 分桶
将行拆分为四分位数和百分位区间
使用 NTILE 分桶 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。
何时需要等量分桶
面试官会问:“将客户按消费金额分成四个数量相等的组”,或者“每一行属于哪个十分位组?”使用的工具就是 NTILE。
NTILE(n) 会尽可能均匀地将排序后的行分配到 n 个桶中,并为每行标记从 1 到 n 的桶编号。本课将介绍它如何分配行、如何处理无法整除的行数,以及它与排名的区别。
NTILE 基本语法
对按某个值排序的行使用 NTILE(4),会产生四分位组。与所有窗口函数一样,它需要 OVER 子句;其中的 ORDER BY 决定哪些行进入低值桶,哪些行进入高值桶。
升序排列会将最小值放入桶 1;降序排列则相反。
SELECT
customer_id,
total_spend,
NTILE(4) OVER (ORDER BY total_spend) AS spend_quartile
FROM customers;NTILE 如何分配行
有 12 行并使用 NTILE(4) 时,每个桶恰好得到 12 / 4 = 3 行。桶 1 包含最低的 3 个值,桶 4 包含最高的 3 个值。
关键点是:NTILE 按行数分配,而不是按数值范围分配。只要行数相同,两个桶就可以覆盖完全不同的数值跨度。
无法整除时
如果行数不能被桶数整除,会发生什么?有 10 行并使用 NTILE(4) 时,10 / 4 = 2,余数为 2。NTILE 会将额外的行分配给前面的桶。
- 桶 1:3 行
- 桶 2:3 行
- 桶 3:2 行
- 桶 4:2 行
因此,各桶的大小最多相差一行,并且行数更多的桶排在前面。这条具体规则是面试中经常考查的细节。
NTILE 不会根据值处理并列
一个关键陷阱是:NTILE不会让相同的值处于同一个桶中。它按位置填充分桶,因此两个 total_spend 相同的行,完全可能仅仅因为行顺序不同而进入不同的桶。
如果业务要求相同的值属于同一层级,NTILE 就不是合适的工具;您需要改用基于值的方法。面试官经常会故意设置这个陷阱。
十分位数和百分位数
桶的数量就是您传入的数字。NTILE(10) 会产生十分位组,NTILE(100) 会产生百分位区间。分析师可以用这种方式将用户划分为绩效层级或风险区间。
输出结果是桶编号,因此位于 NTILE(10) 桶 9 中的值属于倒数第二高的十分位组。
SELECT
user_id,
score,
NTILE(10) OVER (ORDER BY score DESC) AS decile
FROM leaderboard;按组分桶
添加 PARTITION BY,即可在每个组内独立分桶,例如按区域计算消费金额的四分位组。每个区域都会从桶 1 重新开始。
这样就能回答“每个区域内处于消费金额最高四分位的客户”这类问题,即使某个区域的总体消费金额较低,它也仍然拥有自己的桶 4。
SELECT
region,
customer_id,
total_spend,
NTILE(4) OVER (
PARTITION BY region
ORDER BY total_spend DESC
) AS regional_quartile
FROM customers;筛选特定层级
不能直接将 NTILE(...) 放入 WHERE 子句;窗口函数是在 WHERE 之后计算的。请将查询封装在 CTE 或子查询中,然后根据分桶列进行筛选。
“给我消费金额最高四分位的客户”是 NTILE 在实际回答中最常见的使用方式。
WITH q AS (
SELECT customer_id, total_spend,
NTILE(4) OVER (ORDER BY total_spend DESC) AS quartile
FROM customers
)
SELECT customer_id, total_spend
FROM q
WHERE quartile = 1;NTILE 与基于值的百分位数
NTILE 按相等的行数分桶。如果您需要真正的统计百分位数(例如第 90 百分位的值),请使用 PERCENTILE_CONT 或 PERCENTILE_DISC。
- NTILE(100):根据排名位置判断某行属于哪个百分位区间。
- PERCENTILE_CONT(0.9):第 90 百分位处的实际值。
了解这一差别,才能给出自信而不是猜测性的答案。
何时 ORDER BY 很重要
NTILE 要求在 OVER 内使用 ORDER BY;没有明确的顺序,分桶就没有意义。排序方向决定哪一端属于桶 1。
如果并列值使分配结果存在歧义,并且某个临界行的确切桶编号很重要,请在排序中添加用于打破并列的列,以获得确定且可复现的结果。
用名称标记分桶
原始桶编号(1、2、3、4)很少是最终交付结果。分析师通常会使用 CASE 表达式,根据 NTILE 的结果将它们映射为“低”“中”“高”和“顶级”等业务标签。
请先在 CTE 中计算 NTILE,然后在外层查询中转换编号。这样可以保持窗口逻辑清晰,并使输出适合直接展示。
WITH q AS (
SELECT customer_id, total_spend,
NTILE(4) OVER (ORDER BY total_spend) AS bucket
FROM customers
)
SELECT customer_id, total_spend,
CASE bucket
WHEN 1 THEN 'Low'
WHEN 2 THEN 'Medium'
WHEN 3 THEN 'High'
WHEN 4 THEN 'Top'
END AS spend_tier
FROM q;快速检查
测试无法整除时的分配规则。
回顾
NTILE 会将排序后的行分配到数量尽可能相等的桶中:
NTILE(n)为行标记 1..n;NTILE(4)表示四分位组,NTILE(10)表示十分位组。- 它按行数而不是数值范围进行分配,并将额外的行放入前面的桶。
- 它不会让并列值处于同一个桶中,也不能直接放入
WHERE。 - 如果需要真正的百分位值,请使用
PERCENTILE_CONT。
接下来:使用 FIRST_VALUE、LAST_VALUE 和窗口帧边界提取边界值。
常见问题解答
「使用 NTILE 分桶」课时是免费的吗?
是的 — 「使用 NTILE 分桶」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。
「使用 NTILE 分桶」这节课中我会学到什么?
将行拆分为四分位数和百分位区间 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 NTILE 分桶」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Interview Prep 课中编写并运行代码吗?
能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。