添加自定义列
在 Metabase 中创建自定义列,用于计算新指标或清理数据
Metabase 允许您即时创建新字段,这些字段基于其他列的信息。例如,您可以
- 添加两个列
- 提取日期的一部分
- 基于逻辑条件定义新列
Metabase 将这些新的派生列称为“自定义列”。
要创建自定义列,您可以使用 自定义表达式,它类似于电子表格中的公式或 SQL 中的函数。例如,您可以使用 substring 函数提取文本的一部分,并使用 case 根据条件定义值。
在本教程中,我们将介绍自定义列的一些最常见用例。我们将使用示例数据库中的 Analytic Events 表,该表包含一家虚构产品的事件数据。我们将构建一些有助于产品分析的自定义列示例。
添加自定义列
基于 Analytic Events 表启动一个新的查询生成器问题。
要添加自定义列,请点击“数据”块下方的灰色按钮。
您将看到 Metabase 表达式编辑器。您可以使用快捷方式来合并或提取列中的数据,或编写自己的表达式。在开始之前,有几点需要注意
- 在表达式编辑器中使用
[]来引用列,例如[Timestamp],或者[Accounts → Timestamp]来引用已连接表中的列。幸运的是,您无需自己输入完整的列名(或方括号),因为在您开始键入时 Metabase 会提供自动完成选项。 - 您可以在自定义表达式中使用类似
OR、AND、<、=、!=这样的运算符。 - 某些自定义表达式存在数据库限制。请查看 我们的文档 以获取完整列表。
SQL 专家请注意
在 SQL 中,列操作(如 Total + Tax 或 DateDiff(Created_At, Canceled_at, 'week'))和聚合(如 SUM(Total) 或 AVG(Quantity))都在 SELECT 子句中定义。在 Metabase 查询生成器中,这些是不同的查询阶段:列上的运算符和函数在自定义列块中定义,而对列的聚合在单独的“汇总”块中定义。您无法在自定义列中使用 Sum、Count 等聚合函数,但可以在“汇总”块中定义自定义汇总。
查看我们关于 如何汇总数据 的教程以了解更多信息。
提取和合并列
您可以提取日期或 URL 列的部分,并连接列。
例如,您可能对一天中事件活动的分布感兴趣:人们最活跃的时间是几点?
-
要添加自定义列,请点击“数据”块下方的灰色按钮。
您可以添加表达式,或者提取或合并列。
-
在“快捷方式”下的表达式编辑器中,选择“提取列”。
提取快捷方式适用于 URL 列或时间戳列。对于 URL 列,您可以选择提取主机、域名或子域名。对于时间戳列,您可以提取日期或时间的部分。
-
选择
Timestamp列并提取Hour of day您将看到自定义表达式编辑器,其中包含表达式
hour([Timestamp])。所有快捷方式只是为您预填充表达式。 - 点击“完成”以保存自定义列并关闭编辑器。
- 预览结果。

您将在结果中看到一个名为 Hour of day 的新列,其中 0 表示午夜 12 点到凌晨 1 点之间的时间戳,1 表示凌晨 1 点到 2 点之间的时间戳,依此类推。
处理文本
您可以使用自定义列来清理、格式化或操作文本。
例如,分析事件中的 URL 格式为 www.piespace.example/<path>。由于每个 URL 的域名都相同,因此仅使用 path 部分进行分析是有意义的。但是,提取 URL 快捷方式只能提取主机、域名或子域名。对于路径,您需要编写自己的自定义表达式
-
通过点击“自定义列”块中的 **+** 来创建一个新的自定义列,并在“表达式”字段中输入表达式
regexextract([Page URL], "/.*")regexextract使用正则表达式提取Page URL中以/开头的ส่วน。有关regexextract表达式的更多信息,请参阅 我们的文档。 - 将列命名为
URL Path,然后点击“完成”。 -
预览结果。

其他有用的文本函数:replace、substring、concat。请参阅 字符串函数 了解完整列表。
处理日期
您可以使用日期自定义表达式来查找两个日期之间的差异,添加或减去周期,或者提取日期的部分。
例如,如果您对新老访问者行为差异感兴趣,您可以创建一个包含从账户创建到事件发生之间经过天数的列。
-
通过点击“自定义列”块中的 **+** 来创建一个新的自定义列,并在“表达式”字段中输入表达式
datetimeDiff([Account → Created At],[Timestamp], "day")Created At列位于Account表中,而不是作为问题源的Analytic Events表中。但是,因为Account表通过 Account ID 列连接到Analytic Events表,所以在关于Analytic Events的问题中,Metabase 可以使用Account表中的数据。您只需要使用→指定列来自哪个表。有关
datetimeDiff表达式的更多信息,请参阅 我们的文档。 - 将该列保存为
Days since creation(我们稍后会引用这个名称)。 -
预览结果。

其他有用的日期函数:datetimeAdd、convertTimezone、now。请参阅 日期函数 了解完整列表。
进行数学运算
您可以使用自定义表达式对列和数字进行常规数学运算:例如,您可以将两个列相加,将一个列乘以 100,或将值 round 到整数。
在上一步中,您使用 datetimeDiff 表达式计算了事件和账户创建之间经过的天数。如果您需要将该数字转换为周,只需将 datetimeDiff 自定义表达式与 "weeks" 周期一起使用,但这只会得到完整的周数。如果您想知道账户已存在 3.5 周,可以将天数除以 7。
-
通过点击“自定义列”块中的 **+** 来创建一个新的自定义列,并在“表达式”字段中输入表达式
[Days since creation] / 7这里的
[Days since creation]是您在上一步创建的自定义列的名称(定义新列时可以引用其他自定义列)。 -
将该列保存为
Weeks since creation并预览结果。
有关数学函数的完整列表,请参阅 数学函数。
添加 if-then 逻辑
在前两步中,您计算了事件发生时账户的年龄(以周为单位)。假设您想利用这些信息来查看新老访问者的事件。为此,您需要根据事件发生时账户的年龄,将账户分桶为“新”或“现有”。在 Metabase 中,逻辑语句使用 case 语句定义(类似于 SQL 的 CASE,但不同于电子表格,电子表格使用 IF 函数来实现此目的)。
-
通过点击“自定义列”块中的 **+** 来创建一个新的自定义列,并在“表达式”字段中输入表达式
case([Weeks since creation] < 52, "New", "Existing")新列将包含账户年龄小于一年(52 周)的事件的
"New",否则为"Existing"。有关
case表达式的更多信息,请参阅 我们的文档。 -
将列保存为
Account status并预览结果。

其他有用的逻辑函数:coalesce、isnull。请参阅 逻辑函数 了解逻辑函数的完整列表。
使用自定义列构建查询和图表
自定义列与表列的工作方式相同,因此您可以在过滤器、汇总和构建图表中进行使用。
例如,我们可以查看新账户一天中不同事件的分布。
-
为新账户和非空 URL 路径添加过滤器
您需要将过滤器操作从默认的“包含”更改。

-
按小时计算每个 URL 路径的事件数。
自定义列应该会出现在“分组依据”块中。

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

顺便说一句,截图中的图表启用了一些额外的可视化设置,使其看起来更美观。尝试在“数据”选项卡中调整系列设置(“数据”选项卡中每个系列的三个点菜单),看看是否能让您的图表看起来一样。
那么,关于新账户事件,我们可以说什么?我们看到所有事件都遵循类似的模式:大部分在早晨和下午早些时候触发,午餐时有所下降。但对 /help 页面的访问在晚上 7 点左右有一个额外的峰值。
后续步骤
自定义表达式不仅可以用于新列——您还可以使用它们来构建复杂的过滤器或摘要。请查看关于 自定义表达式 的扩展教程。