计算字段

2024-10-21 Guide
  • 分析师
  • 普通用户
  • 图表设计
About 22 min

在数据分析时,如果基础数据没有包括回答问题所需的所有字段,可以增加计算字段,增加的计算字段将作为原始明细数据字段的一部分参与运算

场景

  1. 普通字段类型转换
  • 日期格式转换: 将一个日期字段从字符串格式转换为日期格式。例如,将”20230809”转换为”2023-08-09”。
  • 数值转换: 将文本格式的数值转换为实际数值类型,如将”1000”转换为整数1000,或将”3.14”转换为浮点数。
  • 货币转换: 将一个货币值从一种货币单位转换为另一种货币单位,例如从美元转换为欧元。
  1. 字段间的运算
  • 销售金额计算: 通过乘法计算单价和数量,得出销售金额(Sales Amount = Unit Price * Quantity)。
  • 折扣后的价格: 计算应用折扣后的最终价格,如Final Price = Original Price - (Original Price * Discount)。
  • 时间差计算: 计算两个日期或时间字段之间的差值,例如计算一个项目的完成时间或订单的处理时间(Processing Time = End Date - Start Date)。
  1. 逻辑判断
  • 分类判断: 基于特定条件对数据进行分类,如Case When Age >= 18 Then 'Adult' Else 'Minor' End。
  • 评分计算: 根据多条件对记录进行评分,如计算客户的信用评分或产品的质量等级。
  • 状态标记: 基于某些业务规则为记录添加状态标记,例如,如果库存量低于某个阈值,标记为“缺货”。
  1. 汇总字段

累计总和: 计算一个列的累计总和,如SUM(Sales) OVER (ORDER BY Date),用以分析销售趋势。 排名: 使用ROW_NUMBER()或RANK()函数对记录进行排名,如根据销售额对销售人员排名。 分区求和: 使用SUM(Sales) OVER (PARTITION BY Region)按区域对销售进行分组汇总。

# 使用须知

使用须知

对于jdbc数据源,汇总类型计算字段需要数据库支持窗口函数, 常用数据除mysql8.0之前的版本均已支持窗口函数
数据源大类上目前支持关系型数据库文本Http在线表格,ES和MongoDB暂不支持,此外关系型数据库如果使用汇总类型的计算字段对数据库版本也有一定要求,
再次特别提示:MySQL需要8.0以上版本, 8.0以下的汇总级计算字段可以用LOD FIXED表达式,实现同样的效果 mysql版本查询语法如下:

SELECT VERSION()
1

# 添加计算字段

在字段列表下方的计算字段栏,点击加号,添加计算字段

  • 图形化定义普通计算字段与窗口函数计算字段

计算字段编辑器如下:

  • 字段命名:必填相当于数据库表字段名,命名支持中文
  • 字段列表:为原始字段列表,点击字段自动插入字段定义编辑器
  • 计算列段列表:为其他计算字段,如果自身是汇总类型计算字段则不能引用其他汇总类型计算字段
  • 字段定义:计算字段定义表达式
  • 汇总字段开关:切换字段是否需要进行汇总
  • 汇总函数列表:常用汇总函数列表,点击函数自动插入字段定义编辑器
  • 分组字段栏:可拖拽原始0个或多个字段作为分组栏,不拖入字段则为全表汇总
  • 组内排序字段:可拖拽原始字段到组内排序,注意:如果使用的是sum、count、avg,排序之后计算值会变成累计值
  • 模式切换:普通模式、高级模式,高级模式下可以相当于用纯sql脚本定义计算字段可以是普通计算字段,也可以是带窗口函数的汇总计算字段
  • 查看字段值:计算字段定义完成之后,点击确认关闭窗口,在数据集编辑的预览查询中查看计算字段值,汇总计算字段开销比较大,当数据量比较大,而且有多个汇总字段时预览会比原始数据预览要慢

# 添加计算字段到模型

添加到模型

计算字段定义完成之后与普通字段列表一样,需要拖拽添加到数据集模型

  • 拖拽到维度之后,可以编辑维度节点设置原始数据类型
  • 日期类型计算字段拖拽到模型之后,需要编辑维度节点,设置原始数据类型为日期

# 计算字段间引用

CASE 
     WHEN #{首次下单时间} = `order date` THEN '新客'
     ELSE '老客'
END
1
2
3
4

计算字段间任意易用

1.15汇总计算字段不能引用其他汇总字段,在1.16之后所有的计算字段只要引用不成死循环,都可以任意引用。

# 动态计算

只有在分析中用到的计算字段才会在查询中构造,避免无用的运算开销

# 配套支持

过滤组合、维度成员获、指标字段统计取均已支持使用计算字段

Q&A

  1. 问: 我使用SQL数据集,这些计算字段能分分钟设计出来,还需要使用计算字段吗?
    答: 如果是非汇总类型字段(不需要使用窗口函数),可以直接在数据集sql中添加,但是如果是汇总类型计算字段,BI引擎会根据分析中是否使用到该字段动态决定是否构造查询,相较直接在sql中增加汇总运算字段在性能上会比有好一些. 此外如果多个计算之间有运算,利用计算字段间的引用也能减少一些sql编写工作量, 比如上面案例中case when中使用了汇总字段。

  2. 问: 计算字段与数据集表达式字段有什么区别?
    答: 数据集表达式使用场景是针对汇总结果之后的字段间运算,而计算字段运行在汇总之前明细数据级别,相当于给原始表新增了列。

  3. 问: 哪些类型数据源可以使用计算字段?
    答: 数据源大类上目前支持关系型数据库文本Http在线表格,ES和MongoDB暂不支持,此外关系型数据库如果使用汇总类型的计算字段对数据库版本也有一定要求,特别提示:MySQL需要8.0以上版本

# 统一函数

为了方面用户使用,在BI平台上我们提供了一套统一的计算函数,详情请参考 统计计算函数, 如:

YEAR(dt) -- 获取到日期的年份
1

# LOD FIXED

  • LOD FIXED 详细级别表达式使用指定的维度计算汇总值,而不引用视图中的维度。
  • FIXED为计算字段,运行在视图汇总之前。
语法 {FIXED [维度声明] : [聚合表达式]}
参数说明
维度声明:指定聚合表达式要连接到的一个或多个维度。使用逗号分隔各个维度, 如果没有维度声明则计算总体汇总。
聚合表达式:聚合表达式是所执行的计算,用于定义目标维度。
定义 根据指定维度进行聚合计算,不引用其他任何维度。
说明 维度声明中的元素可以是单个字段,或者是计算字段或计算字段的引用

示例1. FIXED 详细级别表达式计算每个区域的销售额总和:

{FIXED `Region` : SUM(`Sales`)}
1

示例2. 计算客户最早下单时间

{FIXED `客户名称` : min(YEAR(`订单日期`))}
1

示例3. 计算客户每年订单数量

{FIXED `客户名称`, YEAR(`订单日期`) : distinct(`订单ID`)}
-- 或者
{FIXED `客户名称`, YEAR(`订单日期`) : count(distint `订单ID`)}
1
2
3

# FIXED过滤

由于FIXED是计算字段,所以不受视图上的维度过滤影响, 如果要在FIXED中过滤可以使用条件计算如:

{FIXED YEAR(`订单日期`) : sum( 
   IF(YEAR(`订单日期`)=2023 AND `装运模式` = '一级', `销售额`, 0) 
   )}
1
2
3

注意

使用汇总级计算字段时,在自助分析中的汇总类型请选择min/max

Last update: October 23, 2024 14:20