添加自定义列

在 Metabase 中创建自定义列以计算新指标或清理数据

Metabase 允许您利用其他列的信息即时创建新字段。例如,您可以

  • 添加两列
  • 提取日期的一部分
  • 根据逻辑条件定义新列

Metabase 将这些新的派生列称为“自定义列”。

要创建自定义列,您可以使用自定义表达式,它们类似于电子表格中的公式或 SQL 中的函数。例如,您可以使用 substring 函数提取文本的一部分,并使用 case 定义基于条件的值。

在本教程中,我们将介绍自定义列的一些最常见用例。我们将使用示例数据库中的 Analytic Events 表,该表包含虚构产品的事件数据。我们将构建可用于产品分析的自定义列示例。

添加自定义列

基于 Analytic Events 表开始一个新的查询构建器问题。

要添加自定义列,请单击“数据”块下的灰色按钮。

您将看到 Metabase 表达式编辑器。您可以使用快捷方式组合或提取列中的数据,或编写自己的表达式。开始之前,请注意以下几点

  • 在表达式编辑器中使用 [] 引用列,例如 [Timestamp],或 [Accounts → Timestamp] 用于连接表中的列。幸运的是,您无需自己输入完整的列名(或括号),因为 Metabase 会在您开始输入时提供自动完成选项。
  • 您可以在自定义表达式中使用 ORAND<=!= 等运算符。
  • 某些自定义表达式存在数据库限制。请查看我们的文档以获取完整列表。

SQL 专家注意事项

在 SQL 中,列操作(如 Total + TaxDateDiff(Created_At, Canceled_at, 'week'))和聚合(如 SUM(Total)AVG(Quantity))都在 SELECT 子句中定义。在 Metabase 查询构建器中,这些是不同的查询阶段:列上的运算符和函数在自定义列块中定义,但列上的聚合在单独的“汇总”块中定义。您无法在自定义列中使用 SumCount 等聚合,但可以在“汇总”块中定义自定义汇总。

请查看我们关于如何汇总数据的教程以了解更多信息。

提取和组合列

您可以提取日期或 URL 列的部分,并连接列。

例如,您可能对事件活动在一天中的分布感兴趣:人们最活跃的时间是几点?

  1. 要添加自定义列,请单击“数据”块下的灰色按钮。

    您可以添加表达式,或提取或组合列。

  2. 在“表达式编辑器”的快捷方式下,选择提取列

    提取快捷方式适用于 URL 列或时间戳列。对于 URL 列,您可以选择提取主机、域或子域。对于时间戳列,您可以提取日期或时间的部分。

  3. 选择 Timestamp 列并提取 Hour of day

    您将看到自定义表达式编辑器,其中包含表达式 hour([Timestamp])。所有快捷方式都只是为您预填充表达式。

  4. 单击完成保存自定义列并关闭编辑器。
  5. 预览结果。

Hour of day

您将在结果中看到一个新列 Hour of day,其中 12 AM 到 1 AM 之间的时间戳为 0,1 AM 到 2 AM 之间的时间戳为 1,依此类推。

处理文本

您可以使用自定义列来清理、格式化或操作文本。

例如,分析事件中的 URL 格式为 www.piespace.example/<path>。由于每个 URL 的域都相同,因此仅使用 path 部分进行分析是有意义的。但是提取 URL 快捷方式只能提取主机、域或子域。对于路径,您需要编写自己的自定义表达式

  1. 通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式

    regexextract([Page URL], "/.*")
    

    regexextract 使用正则表达式抓取 Page URL 中以 / 开头的部分。在我们的文档中阅读有关 regexextract 表达式的更多信息。

  2. 将列命名为 URL Path,然后单击完成
  3. 预览结果。

    URL custom col

其他有用的文本函数:replacesubstringconcat。有关完整列表,请参见字符串函数

处理日期

您可以使用日期自定义表达式查找两个日期之间的差异、添加或减去时间段,或提取日期的一部分。

例如,如果您对新访客和老访客的行为差异感兴趣,您可以创建一个列,其中包含从账户创建到事件发生之间经过的天数。

  1. 通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式

    datetimeDiff([Account → Created At],[Timestamp], "day")
    

    Created At 列位于 Account 表中,而不是用作问题源的 Analytic Events 表中。但是,由于 Account 通过 Account ID 列连接到 Analytic Events 表,Metabase 可以在有关 Analytic Events 的问题中使用 Account 列中的数据。您只需使用 指定列来自不同的表。

    我们的文档中阅读有关 datetimeDiff 表达式的更多信息。

  2. 将列保存为 Days since creation(我们稍后将引用此名称)。
  3. 预览结果。

    Days since creation

其他有用的日期函数:datetimeAddconvertTimezonenow。有关完整列表,请参见日期函数

进行数学运算

您可以将自定义表达式用于列和数字的常见数学运算:例如,您可以将两列相加,将一列乘以 100,或将值四舍五入为整数。

在上一步中,您使用 datetimeDiff 表达式计算了分析事件和账户创建之间经过的天数。如果您需要以周为单位的数字,您可以使用相同的 datetimeDiff 自定义表达式和 "weeks" 时间段,但这样您只会得到完整周数。如果您想知道账户已创建 3.5 周,您可以将天数除以 7

  1. 通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式

    [Days since creation] / 7
    

    这里的 [Days since creation] 是您在上一步中创建的自定义列的名称(您可以在定义新列时引用其他自定义列)。

  2. 将列保存为 Weeks since creation 并预览结果。

    Weeks since creation

有关数学函数的完整列表,请参见数学函数

添加 if-then 逻辑

在前面两步中,您计算了事件发生时账户的年龄(以周为单位)。假设您想使用此信息来查看新账户与现有账户的事件。为此,您需要首先根据账户在事件发生时的年龄将其分类为“新”或“现有”。在 Metabase 中,逻辑语句使用 case 语句定义(类似于 CASE SQL,但不同于电子表格,其中 IF 函数用于此目的)。

  1. 通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式

    case([Weeks since creation] < 52, "New", "Existing")
    

    新列将为创建时间不足一年(52 周)的账户的事件显示 "New",否则显示 "Existing"

    我们的文档中阅读有关 case 表达式的更多信息。

  2. 将列保存为 Account status 并预览结果。

Account status

其他有用的逻辑函数:coalesceisnull。有关完整列表,请参见逻辑函数

使用自定义列构建查询和图表

自定义列的作用与表列相同,因此您可以在过滤器、汇总中使用它们,并构建图表。

例如,我们可以查看新账户在一天中不同事件的分布。

  1. 为新账户和非空 URL 路径添加过滤器

    您需要将筛选操作从默认的“包含”更改。

    Filter operation

  2. 按小时统计每个 URL 路径的事件。

    自定义列应该会直接显示在“按此分组”块中。

    Summarize

  3. 可视化

    当您在查询构建器中单击“可视化”时,Metabase 将自动构建一个透视表。为了更好地可视化每日模式数据,您可以切换到折线图或面积图。

Final chart

顺便说一下,屏幕截图中的图表开启了一些额外的可视化设置,使其看起来更好看。在“数据”选项卡中(“数据”选项卡中每个系列的三个点菜单)尝试使用系列设置,看看您是否能让您的图表看起来一样。

那么我们能从新账户事件中得出什么结论呢?我们看到所有事件都遵循相似的模式:大部分在上午和下午早些时候触发,午餐时间会下降。但 /help 页面的访问量在晚上 7 点左右有一个额外的峰值。

后续步骤

自定义表达式不仅仅用于新列,您还可以使用它们来构建复杂的过滤器或摘要。请查看关于自定义表达式的扩展教程。

这有帮助吗?

感谢您的反馈!
分析师每周技巧
获取可行的见解
关于 AI 和数据的资讯,直接发送到您的收件箱
© . This site is unofficial and not affiliated with Metabase, Inc.