添加自定义列
在 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
,其中 12 AM 到 1 AM 之间的时间戳为 0,1 AM 到 2 AM 之间的时间戳为 1,依此类推。
处理文本
您可以使用自定义列来清理、格式化或操作文本。
例如,分析事件中的 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
表,Metabase 可以在有关Analytic Events
的问题中使用Account
列中的数据。您只需使用→
指定列来自不同的表。在我们的文档中阅读有关
datetimeDiff
表达式的更多信息。 - 将列保存为
Days since creation
(我们稍后将引用此名称)。 -
预览结果。
其他有用的日期函数:datetimeAdd
、convertTimezone
、now
。有关完整列表,请参见日期函数。
进行数学运算
您可以将自定义表达式用于列和数字的常见数学运算:例如,您可以将两列相加,将一列乘以 100,或将值四舍五入
为整数。
在上一步中,您使用 datetimeDiff
表达式计算了分析事件和账户创建之间经过的天数。如果您需要以周为单位的数字,您可以使用相同的 datetimeDiff
自定义表达式和 "weeks"
时间段,但这样您只会得到完整周数。如果您想知道账户已创建 3.5 周,您可以将天数除以 7
-
通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式
[Days since creation] / 7
这里的
[Days since creation]
是您在上一步中创建的自定义列的名称(您可以在定义新列时引用其他自定义列)。 -
将列保存为
Weeks since creation
并预览结果。
有关数学函数的完整列表,请参见数学函数。
添加 if-then 逻辑
在前面两步中,您计算了事件发生时账户的年龄(以周为单位)。假设您想使用此信息来查看新账户与现有账户的事件。为此,您需要首先根据账户在事件发生时的年龄将其分类为“新”或“现有”。在 Metabase 中,逻辑语句使用 case
语句定义(类似于 CASE
SQL,但不同于电子表格,其中 IF
函数用于此目的)。
-
通过单击自定义列块中的 + 创建新自定义列,并在表达式字段中输入表达式
case([Weeks since creation] < 52, "New", "Existing")
新列将为创建时间不足一年(52 周)的账户的事件显示
"New"
,否则显示"Existing"
。在我们的文档中阅读有关
case
表达式的更多信息。 -
将列保存为
Account status
并预览结果。
其他有用的逻辑函数:coalesce
、isnull
。有关完整列表,请参见逻辑函数。
使用自定义列构建查询和图表
自定义列的作用与表列相同,因此您可以在过滤器、汇总中使用它们,并构建图表。
例如,我们可以查看新账户在一天中不同事件的分布。
-
为新账户和非空 URL 路径添加过滤器
您需要将筛选操作从默认的“包含”更改。
-
按小时统计每个 URL 路径的事件。
自定义列应该会直接显示在“按此分组”块中。
-
可视化
当您在查询构建器中单击“可视化”时,Metabase 将自动构建一个透视表。为了更好地可视化每日模式数据,您可以切换到折线图或面积图。
顺便说一下,屏幕截图中的图表开启了一些额外的可视化设置,使其看起来更好看。在“数据”选项卡中(“数据”选项卡中每个系列的三个点菜单)尝试使用系列设置,看看您是否能让您的图表看起来一样。
那么我们能从新账户事件中得出什么结论呢?我们看到所有事件都遵循相似的模式:大部分在上午和下午早些时候触发,午餐时间会下降。但 /help
页面的访问量在晚上 7 点左右有一个额外的峰值。
后续步骤
自定义表达式不仅仅用于新列,您还可以使用它们来构建复杂的过滤器或摘要。请查看关于自定义表达式的扩展教程。