使用表达式配置自定义指标
除了从右侧拖拽字段并选择聚合方式,您也可以直接添加自定义指标。
编辑仪表盘时,自定义指标的数据结果无法展示,可在预览时查看效果;关于预览的更多内容,请查看预览、暂存和上线
您可以根据分析场景需要,使用当前语言(如 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 子句表达的条件从聚合处理中删除行
假设数据为
| channel | pay_amount |
|---|---|
| iOS | 648 |
| Android | 68 |
您可以创建两个自定义指标,实现“行转列”
-- 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 子句用作窗口函数
假设数据为
| user | channel | pay_amount |
|---|---|---|
| a | iOS | 648 |
| b | Android | 68 |
| c | Android | 6 |
| d | Android | 128 |
希望最终得到结果为
| user | channel | 付费金额在 channel 的占比 |
|---|---|---|
| a | iOS | 648 |
| b | Android | 68 / (68 + 6 + 128) |
| c | Android | 6 / (68 + 6 + 128) |
| d | Android | 128 / (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语句增加新的维度字段

