0Pricing
SQL Interview Prep · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 LAG 和 LEAD 获取相邻行
  2. 期间环比变化
  3. 使用 NTILE 分桶
  4. FIRST_VALUE、LAST_VALUE 与窗口边界
← 返回 SQL Interview Prep