什么是自定义计算?

使用自定义计算可以定义动态指标和转换,而无需修改数据集查询。 本文介绍如何在 AI/BI 仪表板中使用自定义计算。

为何使用自定义计算?

使用自定义计算,无需修改源 SQL 即可从现有仪表板数据集创建和可视化新字段。 可以定义两种类型的自定义计算:

  • 计算度量值:总销售额或平均成本等聚合值。 这些命令可以使用 AGGREGATE OVER 该命令来计算跨时间范围的值。
  • 计算维度:未聚合的值或转换,例如对年龄范围或格式字符串进行分类。

自定义计算的行为与度量视图类似,但其范围限制在定义它们的数据集和仪表板。 若要定义可用于其他数据资产的自定义指标,请参阅 Unity 目录指标视图

使用计算度量值创建动态指标

假设你有以下数据集:

条目 区域 价格 成本 日期
苹果 美国 30 15 2024年01月01日
苹果 加拿大 20 10 2024-01-01
橘子 美国 20 15 2024-01-02
橘子 加拿大 15 10 2024年1月2日

你想要按区域直观显示利润率。 如果没有自定义计算,则需要使用 margin 列创建新数据集:

区域 页边距
美国 0.40
加拿大 0.43

虽然此方法有效,但新数据集是静态的,并且可能仅支持单个可视化效果。 应用于原始数据集的筛选器不会影响新数据集,无需进行额外的手动调整。

使用自定义计算,可以使用以下公式将利润率表示为聚合:

(SUM(Price) - SUM(Cost)) / SUM(Price)

此度量值是动态的。 在可视化效果中使用时,它会自动更新以反映应用于数据集的筛选器。

在一定范围内定义计算度量值

仪表板可视化中的一个常见任务是计算度量指标,例如 SUM(sales),在一段范围内,例如过去 7 天。 对于仪表板数据集,使用 AGGREGATE OVER 命令定义这些类型的基于范围的度量值计算。

AGGREGATE OVER 命令可以在当前组或分区之外合并数据。 例如,如果可视化效果按天对数据进行分组,则尾随的 7 天范围允许每天的数据点包含前 6 天的数据。 如果相同的度量值用于按月分组的可视化,则 7 天范围在每个月中仅使用最后 7 天。

使用与上一示例相同的数据集,以下表达式计算尾随 7 天的平均利润率。

(
  (SUM(Price) - SUM(Cost)) / SUM(Price)
) AGGREGATE OVER (
  ORDER BY Date
  TRAILING 7 DAY
)

创建后,可以在任何可视化效果中应用此度量值。

AGGREGATE OVER 语法

AGGREGATE OVER 命令需要以下语法:

{expr} AGGREGATE OVER (ORDER BY {field} {frame})

Arguments

  • expr

    用于评估的有效计算度量表达式

  • 字段 (必需)

    有效的列名称

  • frame (必需) 可以是下列值之一:

    • CURRENT
    • CUMULATIVE
    • ALL
    • (TRAILING|LEADING) 数字单位
      • 数字是整数
      • 单位为 DAYMONTHYEAR
      • 示例: TRAILING 7 DAYLEADING 1 MONTH

下表标识了聚合 over 的帧规格如何与等效 SQL 窗口框架 子句进行比对。

帧规范 等效的 SQL 窗口框架子句
当前 当前行和当前行之间的范围
ALL 在无界限之前和无界限之后之间的范围
累积 上行与当前行之间未绑定的范围
跟踪 <NUMBER><UNIT> <NUMBER>之前与在<UNIT>之前1<UNIT>之间的范围
主导 <NUMBER><UNIT> 范围介于 1 <UNIT> 之后和 <NUMBER><UNIT> 之后

AGGREGATE OVER 与窗口函数相比

AGGREGATE OVER 命令类似于 SQL 中的窗口函数,这些函数通常用于计算指标。 但是,与窗口函数不同,无需在表达式中指定分区字段即可使用 AGGREGATE OVER 。 而是继承了来自可视化查询分组的分区。 这意味着可以更动态地使用这些度量值。 例如,通过将可视化效果的 y 轴和生产线的度量值添加到 x 轴,可以按生产线计算 7 天的移动平均值。

ORDER BY如果未在可视化效果中对字段进行分组,则AGGREGATE OVER采用最后一行的聚合值作为要为每个组显示的值。 如果你熟悉半累加性度量值,则可以将其识别为等效于 last 半累加性行为。

使用自定义维度定义未聚合的值

使用计算维度可以定义未聚合的值或轻量转换,而无需更改源数据集。 为了实现可视化,组织或重新格式化数据时,这非常有用。

例如,若要按年龄组而不是单个年龄分析年龄趋势,可以使用以下表达式定义自定义 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 仪表板,请参阅 创建仪表板 入门。

  1. 打开现有数据集或创建新数据集。

  2. 单击 “自定义计算”。

    结果面板右上角突出显示了自定义计算按钮。

  3. 此时会在屏幕右侧打开 “创建计算 ”面板。 在 名称 文本字段中,输入 每英里成本

  4. (可选)在 “说明 ”文本字段中,输入“使用票价金额和行程距离计算每英里的成本”。

  5. “表达式 ”字段中,输入以下内容:

    try_divide(SUM(fare_amount), SUM(trip_distance))
    
  6. 单击 “创建”

自定义计算编辑器,其中填充了指令中的值。

将自定义计算添加到指标视图

重要

此功能目前以公共预览版提供。

可以在指标视图创建的数据集的基础上定义自定义计算。 打开数据集时,仅显示 结果表架构 。 单击 “自定义计算 ”以定义新的自定义计算。 若要定义其他数据资产可以使用的其他自定义指标,请更改视图定义。 请参阅 Unity 目录指标视图

若要从仪表板数据集编辑器中定义新的指标视图,请参阅 “创建指标”视图

查看架构

单击结果面板中的 “架构 ”选项卡以查看自定义计算及其关联的注释。

计算度量值列在 度量值 部分中,并由 计算度量值图标 fx 标记。 当您在可视化中设置 GROUP BY 时,相关的计算度量值将被动态计算。 在结果表中看不到该值。 计算维度显示在 “维度” 部分中。

计算度量值显示在架构选项卡中。

在可视化效果中使用自定义计算

可以在可视化效果中使用以前创建的 每英里计算成本 度量值。

  1. 单击“画布”。 然后,在画布上添加新的可视化部件。

  2. 使用可视化配置面板编辑设置,如下所示:

    • 数据集:Taxicab 数据
    • 可视化:条形图
    • X 轴:
      • 字段:dropoff_zip
      • 量表类型:分类
      • 转换:
    • Y 轴:
      • 每英里的成本

注释

表可视化效果支持计算维度,但不支持计算度量值。

下图显示了图表。

一张条形图,显示每英里的成本与目的地邮政编码的关系。

应用筛选器时,使用自定义计算的可视化效果会自动更新。 例如,添加 pickup_zip 筛选器将更新可视化效果,以仅显示与所选值匹配的数据。

编辑自定义计算

若要编辑计算,请执行以下操作:

  1. 单击 “数据 ”选项卡,然后单击与要编辑的计算关联的数据集。

  2. 单击结果面板中的“架构”选项卡。

  3. 度量值维度 显示在数据集字段列表下。 单击 “Kebab”菜单图标。 要编辑的计算右侧的 kebab 菜单。 然后单击“编辑”。

  4. “编辑自定义计算 ”面板中,更新要编辑的文本字段。 然后单击 更新

删除自定义计算

若要删除计算,请执行以下操作:

  1. 单击 数据 选项卡,然后单击与要编辑的度量值关联的数据集。

  2. 单击结果面板中的“架构”选项卡。

  3. 措施”部分出现在字段列表下。 单击要编辑的计算右侧的 “Kebab”菜单图标。 然后单击 删除

  4. 在显示的 “删除”对话框中单击 “删除”。

局限性

若要使用自定义计算,必须满足以下条件:

  • 表达式中使用的列必须属于同一数据集。
  • 不支持引用外部表或数据源的表达式,并且可能会失败或返回意外结果。

支持的函数

下表列出了支持的函数。 尝试使用不受支持的函数会导致错误。

聚合函数

必须聚合所有计算度量值。 支持以下聚合操作:

集合体 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(乘数、被乘数) 使两个数字相乘。 如果发生错误,则返回 NULL
try_divide(分红、除数) 用被除数除以除数。 如果发生错误,则返回 NULL
pow 或电源 返回 expr1expr2 次幂结果。

布尔函数和运算符

自定义计算支持基本比较和布尔运算符,例如===<=>=<>is nullANDORNOT!。 还可以使用以下函数计算表达式:

功能 DESCRIPTION
isnull(expr) 如果trueexpr,则返回NULL
isnotnull(expr) 如果 true 不为 expr,则返回 NULL

强制转换函数

使用以下函数将值转换为指定类型:

功能 DESCRIPTION
cast(expr AS type) 将值 expr 转换为目标数据类型 type
try_cast(expr AS type) 将值 expr 安全地转换为 type 类型的目标数据。

日期、时间戳和时间间隔函数

使用以下函数处理日期、时间戳和间隔:

功能 DESCRIPTION
datediff(endDate, startDate) 返回从 startDateendDate 的天数。
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 的第一个 optNexpr;如果没有任何匹配项,则返回 def
CASE { WHEN cond1 THEN res1 } […] [ELSE def] END 返回计算结果为 true 的第一个 resNcondN;如果找不到任何匹配项,则返回 def
coalesce(expr1, expr2 [, …]) 返回第一个非 NULL 参数。
nvl(expr1, expr2) 如果 expr2expr1,则返回 NULL;否则返回 expr1

例子

以下示例演示了自定义计算的常见用途。 每个自定义计算都显示在数据选项卡上数据集的架构中。在画布上,可以选择自定义计算作为字段。

有条件地筛选和聚合数据

使用 CASE 语句来有条件地聚合数据。 以下示例使用 samples.nyctaxi.trips 数据集并计算从 10103 邮政编码开始的所有行程的费用总和。

SUM(CASE
  WHEN pickup_zip=10103 THEN fare_amount
  WHEN pickup_zip!=10103 THEN 0
END)

构造字符串

使用该 CONCAT 函数构造新的字符串值。 请参阅 concat 函数concat_ws 函数

CONCAT(first_name, ' ', last_name)

设置日期格式

用于 DATE_FORMAT 设置可视化效果中显示的日期字符串的格式。

DATE_FORMAT(tpep_pickup_datetime, 'YYYY-MM-dd')