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