添加自定义列

在 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([Timestamp])。所有快捷方式所做的只是为您预填充表达式。

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

Hour of day

您将在结果中看到一个新的列 Hour of day,对于凌晨 12 点到凌晨 1 点之间的时间戳,该列为 0,对于凌晨 1 点到凌晨 2 点之间的时间戳,该列为 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 连接到 Analytic Events 表(通过 Account ID 列),因此 Metabase 可以在关于 Analytic Events 的问题中使用来自 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 语句定义(类似于 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 点左右有一个额外的峰值。

下一步

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

下一步:使用仪表盘过滤器

如何使用过滤器使你的仪表盘更有用和更具互动性

下一篇文章