跳到主要内容

使用表达式配置自定义指标

最近更新 2026/10/03

除了从右侧拖拽字段并选择聚合方式,您也可以直接添加自定义指标。

提示

编辑仪表盘时,自定义指标的数据结果无法展示,可在预览时查看效果;关于预览的更多内容,请查看预览、暂存和上线

您可以根据分析场景需要,使用当前语言(如 Trino)支持的聚合函数生成字段表达式,下面将以Trino为例列举常用的函数,请在上线前确认逻辑无误,表达式异常会导致查询报错。

需要注意的是,字段表达式最后生成的数据结果应当为数值类型,非数值类型的自定义指标将展示为 -。

基础聚合函数​

您可以使用和普通指标一样的聚合方式

函数说明
count(x)计数,null 值会被剔除
count(distinct x)去重计数,null 值会被剔除
avg(x)平均值,仅数值类型字段支持
sum(x)求和,仅数值类型字段支持
max(x)最大值,仅数值类型字段支持
min(x)最小值,仅数值类型字段支持

除了上面的聚合函数外,您还可以使用以下聚合函数

函数说明
count(*)计数,和 count(x)的区别是空行也会计入
max_by(x,y)与输入值中 y 最大值相关联的 x 的值
min_by(x,y)与输入值中 y 最小值相关联的 x 的值
approx_distinct(x)近似去重,与 count(distinct x)有 4‰的误差

更多内容,请参考 Aggregate functions

聚合过程中的过滤

在使用聚合函数时,您可以结合 FILTER 使用 WHERE 子句表达的条件从聚合处理中删除行

假设数据为

channelpay_amount
iOS648
Android68

您可以创建两个自定义指标,实现“行转列”

-- iOS 渠道的付费金额
sum("pay_amount") filter(where "channel" = 'iOS')
-- Android 渠道的付费金额
sum("pay_amount") filter(where "channel" = 'Android')

四则运算​

您可以在字段表达式里使用四则运算符号及具体数字,根据业务场景生成公式类型的指标如付费率、ARPU 等

Operator说明
+加法
-减法
*乘法
/除法

需要注意的是,在Trino中如果您的字段类型是int或bigint,希望除法得到的结果保留小数,需要在表达式里先 cast(字段 as double)再进行计算;如果四则运算中任意项为null,最终得到的结果也为null,请提前进行处理


除了上面的 Operator 外,您可能也会用到以下函数

函数说明
abs(x)绝对值
ceiling(x)返回 x 向上取整到最接近的整数
floor(x)返回 x 向下取整到最接近的整数
approx_distinct(x)近似去重,与 count(distinct x)约有 4‰的误差

更多内容,请参考 Mathematical functions and operators

条件表达式​

在自定义指标中,您可以结合条件表达式获得所需指标结果

函数说明

CASE expression

WHEN value THEN result

[ WHEN ... ]

[ ELSE result ]

END

从上往下根据条件判断,在第一个满足时返回结果,如果都不满足则按else 返回
if(condition, true_value, false_value)根据条件判断,如果为真或为假可返回不同的结果
coalesce(value1, value2[, ...])返回第一个非null的值,可用于避免出现null的情况

更多内容,请参考 Conditional expressions

窗口函数​

语法:函数 OVER (PARTITION BY 分桶字段 ORDER BY 排序字段)

提示

注意:使用窗口函数时,涉及到的分桶字段或排序字段,必须是聚合函数或者 group by 中使用的字段(must be an aggregate expression or appear in GROUP BY clause)

在仪表盘场景中,将基于您选择的维度进行 group by,并且将会按顺序起别名为 group_0,group_1……您需要用该名称用于分桶字段或排序字段

更多内容,请参考 Window functions

聚合函数​

所有聚合函数都可以通过添加 OVER 子句用作窗口函数

假设数据为

userchannelpay_amount
aiOS648
bAndroid68
cAndroid6
dAndroid128

希望最终得到结果为

userchannel付费金额在 channel 的占比
aiOS648
bAndroid68 / (68 + 6 + 128)
cAndroid6 / (68 + 6 + 128)
dAndroid128 / (68 + 6 + 128)

您可以将 user 和 channel 拖入维度,并创建一个自定义指标

sum("pay_amount")/ sum("pay_amount") over(partition by "group_1")

排名函数​

函数说明
rank()返回值在值组中的排名。排名等于该行之前非同列的行数加一
dense_rank()返回值在值组中的排名
row_number()返回每个行的唯一、连续数字

值函数​

函数说明
first_value(x)返回窗口的第一个值
last_value(x)返回窗口的最后一个值
nth_value(x, offset)返回窗口开始处指定 offset的值,offset从 1 开始,可以是任何标量表达式;如果为空或大于窗口则返回 null
lead(x[, offset[, default_value]])返回窗口中当前行之后第 offset 行的值,可以是任何标量表达式,默认为 1 即下一行;如果为空将报错,如果大于窗口则返回 default_value,未指定则返回 null
lag(x[, offset[, default_value]])返回窗口中当前行之前第 offset 行的值,可以是任何标量表达式,默认为 1 即上一行;如果为空将报错,如果大于窗口则返回 default_value,未指定则返回 null

常见问题​

Q:为什么配置的自定义指标数据展示不出来?

A:请检查表达式配置是否有误,包括

  • 字段需要符合语法规范,如果是SR语法,请使用``包裹,如果是Trino语法,请使用""包裹
  • 表达式生成的指标结果需要为数值类型,如果使用max(文本字段)等函数得到非数值类型结果无法展示

Q:为什么查询报错?

A:请检查表达式配置是否有误,包括

  • 使用了不存在的字段
  • 表达式不完整,如缺少括号等
  • 使用了不支持的函数或直接使用了字段而未使用聚合函数

Q:维度字段是否支持自定义?

A:目前暂不支持,您可以调整工作表的SQL语句增加新的维度字段

这篇文档对你有帮助吗?