0Pricing
SQL Academy · 课时

数据分桶与标注

将值转换为类别

数据分桶与标注 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

什么是分桶?

分桶是指将原始值归入命名类别——把数字、日期或代码转换为人类可读的标签。

您不再显示 87 分,而是显示“良好”;不再显示 14 岁,而是显示“青少年”。CASE 表达式是实现这一目标的主要工具。

示例表:订单

本课将始终使用订单表。每行都有订单金额和状态代码。

运行下面的查询,查看我们将要使用的数据。

SELECT id, customer, amount, status
FROM orders
ORDER BY id;

使用 CASE WHEN 进行标记

最简单的分桶模式是检查条件并分配标签。CASE WHEN ... THEN ... ELSE ... END 代码块会为每行返回一个新的字符串。

这里,我们根据金额将每个订单标记为“大额”或“小额”。

SELECT id,
       amount,
       CASE
         WHEN amount >= 500 THEN 'Large'
         ELSE 'Small'
       END AS order_size
FROM orders;

使用 WHEN 链创建多个分桶

您可以添加所需数量的 WHEN 子句。SQL 会从上到下检查它们,并在首次匹配时停止。

此示例将金额分为三个层级:小额、中额和大额。

SELECT id,
       amount,
       CASE
         WHEN amount < 100  THEN 'Small'
         WHEN amount < 500  THEN 'Medium'
         ELSE 'Large'
       END AS order_tier
FROM orders;

对文本值进行分桶

分桶并不只适用于数字。您可以匹配完全相同的文本值,并将其替换为更易理解的标签。

这里,原始状态代码 'P'、'S' 和 'C' 会变成易读的文字。

SELECT id,
       status,
       CASE status
         WHEN 'P' THEN 'Pending'
         WHEN 'S' THEN 'Shipped'
         WHEN 'C' THEN 'Cancelled'
         ELSE 'Unknown'
       END AS status_label
FROM orders;

使用简单 CASE 形式

当您将一列与多个固定值进行比较时,简单 CASE 形式(CASE column WHEN value ...)比在每个 WHEN 子句中重复列名更简短、更易读。

结果与搜索式形式完全相同。

SELECT id,
       CASE status
         WHEN 'P' THEN 'Pending'
         WHEN 'S' THEN 'Shipped'
         WHEN 'C' THEN 'Cancelled'
         ELSE 'Unknown'
       END AS status_label
FROM orders;

在 GROUP BY 中进行分桶

有了分桶标签后,您可以按标签分组,统计每个类别中有多少行。将整个 CASE 表达式包裹在 GROUP BY 中。

此查询展示了小额、中额和大额订单各有多少。

SELECT
  CASE
    WHEN amount < 100  THEN 'Small'
    WHEN amount < 500  THEN 'Medium'
    ELSE 'Large'
  END AS order_tier,
  COUNT(*) AS total_orders
FROM orders
GROUP BY
  CASE
    WHEN amount < 100  THEN 'Small'
    WHEN amount < 500  THEN 'Medium'
    ELSE 'Large'
  END;

使用子查询别名进行分桶

在 GROUP BY 中重复冗长的 CASE 代码块会使语句很繁琐。更简洁的方法是将主查询包装在子查询(或 CTE)中,这样便可以直接引用别名。

SELECT order_tier, COUNT(*) AS total_orders
FROM (
  SELECT
    CASE
      WHEN amount < 100  THEN 'Small'
      WHEN amount < 500  THEN 'Medium'
      ELSE 'Large'
    END AS order_tier
  FROM orders
) AS bucketed
GROUP BY order_tier;

数值分桶:年龄组

年龄分组是分桶的经典应用场景。下面的查询会将每位客户分配到一个命名的年龄段。

请注意,条件从最小值到最大值排列——SQL 会在第一个为真的 WHEN 处停止,因此顺序很重要。

SELECT name,
       age,
       CASE
         WHEN age < 13 THEN 'Child'
         WHEN age < 18 THEN 'Teen'
         WHEN age < 65 THEN 'Adult'
         ELSE 'Senior'
       END AS age_group
FROM customers;

在分桶中标记 NULL

如果值为 NULL,除 IS NULL 外,没有任何 WHEN 条件会与其匹配。没有显式检查时,NULL 会落入 ELSE 分支。

添加 WHEN column IS NULL 子句,为 NULL 指定专属标签。

SELECT id,
       amount,
       CASE
         WHEN amount IS NULL THEN 'No Data'
         WHEN amount < 100   THEN 'Small'
         WHEN amount < 500   THEN 'Medium'
         ELSE 'Large'
       END AS order_tier
FROM orders;

在 ORDER BY 中进行分桶

您也可以直接在 ORDER BY 中使用 CASE 表达式来控制排序优先级,而无需添加新列。

下面的示例始终先显示待处理订单,然后是已发货订单,最后是已取消订单。

SELECT id, customer, status
FROM orders
ORDER BY
  CASE status
    WHEN 'P' THEN 1
    WHEN 'S' THEN 2
    WHEN 'C' THEN 3
    ELSE 4
  END;

快速检查

请测试您对使用 CASE 进行数据分桶和标记的理解。

课程回顾

做得很好!以下是您对数据进行分桶和标记时学到的内容:

  • 分桶使用 CASE WHEN 将原始值转换为命名类别。
  • 多个 WHEN 子句组成链,可以创建多个分桶;SQL 会在首次匹配时停止。
  • 在将一列与固定值进行比较时,简单 CASE 形式(CASE col WHEN val)非常理想。
  • 您可以按 CASE 表达式执行 GROUP BY,统计每个分桶中的行数。
  • 始终使用 WHEN col IS NULL 显式处理 NULL,为其指定有意义的标签。
  • CASE 也可以在 ORDER BY 中使用,以定义自定义排序优先级。

分桶可以用清晰、描述性的标签替代原始代码和数字,让报表更易读。

常见问题解答

「数据分桶与标注」课时是免费的吗?

是的 — 「数据分桶与标注」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「数据分桶与标注」这节课中我会学到什么?

将值转换为类别 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「数据分桶与标注」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. CASE 表达式
  2. 搜索式 CASE 与简单 CASE
  3. 数据分桶与标注
  4. ORDER BY 和聚合中的 CASE
← 返回 SQL Academy