添加自定义列
在 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
通过账户 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
语句定义(类似于 SQL 中的 CASE
,但不同于电子表格,电子表格中使用 IF
函数)。
-
通过单击自定义列块中的 + 创建一个新自定义列,并在表达式字段中输入表达式
case([Weeks since creation] < 52, "New", "Existing")
新列对于不满一年(52 周)的账户事件显示
"New"
,否则显示"Existing"
。在我们的文档中阅读更多关于
case
表达式的信息。 -
将列保存为
Account status
并预览结果。
其他有用的逻辑函数:coalesce
、isnull
。请参阅逻辑函数以获取完整的逻辑函数列表。
使用自定义列构建查询和图表
自定义列的作用与表列相同,因此您可以在筛选器、汇总和构建图表时使用它们。
例如,我们可以查看新账户在一天中不同事件的分布情况。
-
为新账户和非空 URL 路径添加筛选器
您需要将筛选器操作从默认的“包含”更改。
-
按小时统计每个 URL 路径的事件。
自定义列应直接显示在分组依据块中。
-
可视化
当您在查询构建器中单击“可视化”时,Metabase 将自动构建一个数据透视表。为了更好地可视化日常模式数据,您可以切换到折线图或面积图。
顺便说一句,截图中的图表开启了一些额外的可视化设置,使其看起来更美观。您可以尝试数据选项卡中系列设置(数据选项卡中每个系列的三点菜单),看看是否能使您的图表看起来相同。
那么关于新账户事件,我们可以说些什么呢?我们看到所有事件都遵循相似的模式:大部分事件在早上和下午早些时候触发,午餐时间则有所下降。但对 /help
页面的访问在晚上 7 点左右出现了一个额外的峰值。
下一步
自定义表达式不仅可以用于创建新列,还可以用于构建复杂的筛选器或汇总。请查看关于自定义表达式的扩展教程。
下一步:使用仪表盘筛选器
如何使用筛选器使您的仪表盘更有用、更具交互性