使用自定义计算可以定义动态指标和转换,而无需修改数据集查询。 本文介绍如何在 AI/BI 仪表板中使用自定义计算。
为何使用自定义计算?
使用自定义计算,无需修改源 SQL 即可从现有仪表板数据集创建和可视化新字段。 可以定义两种类型的自定义计算:
- 计算度量值:总销售额或平均成本等聚合值
- 计算维度:未聚合的值或转换操作,例如将年龄划分为范围或进行字符串格式化
自定义计算的行为与指标视图类似,但其范围仅限于定义它们的数据集和仪表板。 若要定义可用于其他数据资产的自定义指标,请参阅 Unity 目录指标视图。
示例:计算度量值
假设你有以下数据集:
项 | 区域 | 价格 | 成本 |
---|---|---|---|
苹果 | 美国 | 30 | 15 |
苹果 | 加拿大 | 20 | 10 |
橘子 | 美国 | 20 | 15 |
橘子 | 加拿大 | 15 | 10 |
你想要按区域直观显示利润率。 如果没有自定义计算,则需要使用 margin
列创建新数据集:
区域 | 利润率 |
---|---|
美国 | 0.40 |
加拿大 | 0.43 |
虽然此方法有效,但新数据集是静态的,并且可能仅支持单个可视化效果。 应用于原始数据集的筛选器不会影响新数据集,无需进行额外的手动调整。
使用自定义计算,可以使用以下公式将利润率表示为聚合:
(SUM(Price) - SUM(Cost)) / SUM(Price)
此度量值是动态的。 在可视化效果中使用时,它会自动更新以反映应用于数据集的筛选器。
示例:计算维度
使用计算维度可以定义未聚合的值或轻量转换,而无需更改源数据集。 为了实现可视化,组织或重新格式化数据时,这非常有用。
例如,若要按年龄组而不是单个年龄分析年龄趋势,可以使用以下表达式定义自定义 age_group
维度:
CASE
WHEN age < 18 THEN '<18'
WHEN age >= 18 AND age < 25 THEN '18–24'
WHEN age >= 25 AND age < 35 THEN '25–34'
WHEN age >= 35 AND age < 45 THEN '35–44'
WHEN age >= 45 AND age < 55 THEN '45–54'
WHEN age >= 55 AND age < 65 THEN '55–64'
WHEN age >= 65 THEN '65+'
END
性能优势
自定义计算针对性能进行优化。 当数据集结果行数在 100,000 或以下且大小不超过 100MB 时,浏览器会处理筛选和聚合。 这改进了仪表板响应能力,尤其是在应用筛选器时。 对于较大的数据集,计算由 SQL 仓库处理。 有关更多详细信息,请参阅 数据集优化和缓存 。
创建自定义计算
此示例基于 samples.nyctaxi.trips
数据集创建计算度量值。 它假设你具备操作 AI/BI 仪表板的基本知识。 如果不熟悉创作 AI/BI 仪表板,请参阅 创建仪表板 入门。
打开现有数据集或创建新数据集。
单击 “自定义计算”。
此时会在屏幕右侧打开 “创建计算 ”面板。 在 名称 文本字段中,输入 每英里成本。
(可选)在“说明” 文本字段中,输入“使用票价金额和行程距离计算每英里的成本”。
在 “表达式 ”字段中,输入以下内容:
try_divide(SUM(fare_amount), SUM(trip_distance))
单击 “创建” 。
将自定义计算添加到指标视图
重要
此功能目前以公共预览版提供。
可以在指标视图创建的数据集的基础上定义自定义计算。 打开数据集时,仅显示 结果表 和 架构 。 单击 “自定义计算 ”以定义新的自定义计算。 自定义计算的范围限于定义它们的数据集。 若要定义其他数据资产可以使用的其他自定义指标,请更改视图定义。 请参阅 Unity 目录指标视图。
若要从仪表板数据集编辑器中定义新的指标视图,请参阅 “创建指标”视图。
查看架构
单击结果面板中的 “架构 ”选项卡以查看自定义计算及其关联的注释。
计算度量值列在 度量值 部分中,并由 fx 标记。 当您在可视化中设置
GROUP BY
时,相关的计算度量值将被动态计算。 在结果表中看不到该值。 计算维度显示在 “维度” 部分中。
在可视化效果中使用自定义计算
可以在可视化效果中使用以前创建的 每英里计算成本 度量值。
- 单击“画布”。 然后,在画布上添加新的可视化部件。
- 使用可视化配置面板编辑设置,如下所示:
- 数据集:Taxicab 数据
- 可视化效果:条形图
- X 轴:
- 字段:dropoff_zip
- 量表类型:分类
- 转换:无
- Y 轴:
- 每英里的成本
注释
表可视化效果支持计算维度,但不支持计算度量值。
下图显示了图表。
包含自定义计算的可视化效果会根据应用的筛选器动态更新。 例如,如果你在画布上添加针对 pickup_zip 的筛选器并选择一个筛选值,可视化组件将更新为仅显示源自所选筛选值的行程的每英里成本指标。 生成的条形图相应地反映筛选的数据。
编辑自定义计算
若要编辑计算,请执行以下操作:
- 单击 “数据 ”选项卡,然后单击与要编辑的计算关联的数据集。
- 单击结果面板中的“架构”选项卡。
- 度量值 和 维度 显示在数据集字段列表下。 单击要编辑的计算右侧的
垂直三点菜单。 然后单击“编辑”。
- 在 “编辑自定义计算 ”面板中,更新要编辑的文本字段。 然后单击 更新。
删除自定义计算
若要删除计算,请执行以下操作:
- 单击 数据 选项卡,然后单击与要编辑的度量值关联的数据集。
- 单击结果面板中的“架构”选项卡。
- “措施”部分出现在字段列表下。 单击要编辑的计算右侧的
垂直三点菜单。 然后单击 删除。
- 在显示的 “删除”对话框中单击 “删除”。
局限性
若要使用自定义计算,必须满足以下条件:
- 表达式中使用的列必须属于同一数据集。
- 不支持引用外部表或数据源的表达式,并且可能会失败或返回意外结果。
支持的函数
下表列出了支持的函数。 尝试使用不受支持的函数会导致错误。
聚合函数
必须聚合所有计算度量值。 支持以下聚合操作:
集合体 | DESCRIPTION |
---|---|
avg(expr) 或 mean(expr) | 返回列或表达式中的计算平均值。 |
count(*) | 返回组中的行数。 |
count(DISTINCT expr) | 返回组中的唯一行数。 |
sum(expr) | 返回列或表达式中的值总数。 |
max(expr) | 返回列或表达式中的最大值。 |
min(expr) | 返回列或表达式中的最小值。 |
百分位数(expr, percentage [,frequency]) | 返回组中指定百分比处 expr 的确切百分位值。 |
first(expr [,ignoreNull]) | 返回组的第一个值 expr 。 |
last(expr [,ignoreNull]) | 返回组的最后一个值 expr 。 |
count_if | 返回满足给定条件的行数。 |
中位数 | 返回一组值的中值。 |
stddev | 返回一组值的标准偏差。 |
方差 | 返回一组值的方差。 |
算术运算
可以将表达式与以下算术运算组合在一起:
操作 | DESCRIPTION |
---|---|
expr1 + expr2 | 返回 expr1 和 expr2 的总和。 |
expr1 - expr2 | 返回从 expr2 减去 expr1 时的差值。 |
multiplier * multiplicand | 返回两个表达式的乘积。 |
被除数/除数 | 返回被除数除以除数的结果。 |
- expr | 返回表达式的否定值。 |
+ expr | 返回表达式的值。 |
try_add(expr1,expr2) | 两个值相加。 如果发生错误,则返回 NULL 。 |
try_subtract(expr1,expr2) | 从 expr2 中减去 expr1 。 如果发生错误,则返回 NULL 。 |
try_multiply(multiplier, multiplicand) | 使两个数字相乘。 如果发生错误,则返回 NULL 。 |
try_divide(dividend, divisor) | 用被除数除以除数。 如果发生错误,则返回 NULL 。 |
pow 或 power | 返回 expr1 的 expr2 次幂结果。 |
布尔函数和运算符
自定义计算支持基本比较和布尔运算符,例如=
、==
、<=
、>=
、<
、>
、is null
、AND
、OR
、NOT
、!
。 还可以使用以下函数计算表达式:
功能 | DESCRIPTION |
---|---|
isnull(expr) | 如果true 是expr ,则返回NULL 。 |
isnotnull(expr) | 如果 true 不为 expr ,则返回 NULL 。 |
强制转换函数
使用以下函数将值转换为指定类型:
功能 | DESCRIPTION |
---|---|
cast(expr AS type) |
将值 expr 转换为目标数据类型 type 。 |
try_cast(expr AS type) |
将值 expr 安全强制转换为目标数据类型 type 。 |
日期、时间戳和时间间隔函数
使用以下函数处理日期、时间戳和间隔:
功能 | DESCRIPTION |
---|---|
datediff(endDate, startDate) |
返回从 startDate 到 endDate 的天数。 |
timestampdiff(unit, start, stop ) |
返回以单位为单位测量的两个时间戳之间的差异。 |
date_format(expr, fmt) |
将时间戳转换为 fmt 格式的字符串。 |
timediff(unit, start, stop) |
返回以单位为单位测量的两个时间戳之间的差异。 |
date_part |
从日期或时间戳中提取特定部分,例如年份、月或日。 |
date_trunc |
将日期或时间戳截断为指定单位,例如年份或月份。 |
字符串函数
使用以下函数转换字符串:
功能 | DESCRIPTION |
---|---|
concat(expr1, expr2[, …]) |
返回参数的串联。 |
concat_ws(sep[, expr1[, …]]) |
返回由sep 分隔的字符串的串联。 |
其他功能
还支持以下函数:
功能 | DESCRIPTION |
---|---|
CASE expr { WHEN opt1 THEN res1 } […] [ELSE def] END |
返回等于 resN 的第一个 optN 的 expr ;如果没有任何匹配项,则返回 def 。 |
CASE { WHEN cond1 THEN res1 } […] [ELSE def] END |
返回计算结果为 true 的第一个 resN 的 condN ;如果找不到任何匹配项,则返回 def 。 |
coalesce(expr1, expr2 [, …]) |
返回第一个非 NULL 参数。 |
nvl(expr1, expr2) |
如果 expr2 为 expr1 ,则返回 NULL ;否则返回 expr1 。 |