添加自定义列

在 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 的新列,其中 0 表示午夜 12 点到凌晨 1 点之间的时间戳,1 表示凌晨 1 点到 2 点之间的时间戳,依此类推。

处理文本

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

例如,分析事件中的 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 表,所以在关于 Analytic Events 的问题中,Metabase 可以使用 Account 表中的数据。您只需要使用 指定列来自哪个表。

    有关 datetimeDiff 表达式的更多信息,请参阅 我们的文档

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

    Days since creation

其他有用的日期函数:datetimeAddconvertTimezonenow。请参阅 日期函数 了解完整列表。

进行数学运算

您可以使用自定义表达式对列和数字进行常规数学运算:例如,您可以将两个列相加,将一个列乘以 100,或将值 round 到整数。

在上一步中,您使用 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 语句定义(类似于 SQL 的 CASE,但不同于电子表格,电子表格使用 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 点左右有一个额外的峰值。

后续步骤

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

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.