发布日志v2.3

2025-8-12 About 45 min

# 数据源

# 扩展文本导入支持的日期模式种类

文本/HTTP(API)数据源,导入时字段数据类型设置为日期之后,系统会尝试自动识别一些常用日期格式,把字符串日期转为数据库日期,其中包括:

本次更新增加了以下四种日期格式的支持,这些格式常见于Power BI、Excel等软件的国际日期数据导出。

  • "EEE, MMM d, yyyy", // Thu, Dec 26, 2019
  • "MMM d, yyyy", // Dec 26, 2019
  • "EEEE, MMMM d, yyyy" // Thursday, December 26, 2019
  • "MMMM d, yyyy", // December 26, 2019

# 数据集

# 重要 汇总表达式支持环境变量

此前,实现动态汇总指标,需要在计算字段中使用环境变量新增字段。例如:

`动态指标` = IF('${metric}' = 'count', `批次号`, `货值总金额`)
1

定义好动态指标字段后,在汇总表达式中配合固定的汇总函数(如 SUM)使用。 这种方式虽然能实现一定的动态效果,但汇总函数无法随环境变量切换

SUM(`动态指标`)
1

在本版本中,环境变量直接支持在汇总表达式中使用。您可以在汇总表达式中,根据环境变量的取值,动态切换聚合字段和聚合函数,例如:

IF (
   '${metric}'=='count', count(`批次号`), 
   IF ('${metric}'=='money', sum(`货值总金额`), sum(`合同/提单量`))
)
1
2
3
4

在上述示例中,调整 metric 环境变量的值,即可灵活切换汇总逻辑,实现汇总函数汇总对象字段都以传入变量变化的动态汇总指标。

# 重要 计算字段使用CTE构造

计算字段支持构造 使用CTE(WITH子查询)替代子查询,从而达到简化SQL、优化性能、方便调试的效果。

如上图所示, 右边的查询使用了 WITH 子句(也称为 Common Table Expressions, CTE),与左边的嵌套子查询相比,具有以下优势:

  1. 可读性和维护性

    • 左边的查询使用了大量的嵌套子查询,结构较为复杂,阅读和理解起来相对困难。
    • 右边的查询通过 WITH 子句将复杂的查询分解成多个逻辑部分,每个部分都有一个清晰的名称(如 S0, S1, S2, S3)。这使得代码更易于理解和维护。
  2. 性能优化

    • 嵌套子查询可能会导致重复计算, 尤其是当红色部分数据集定义查询较为复杂,且重复次数过多,而CTE可以避免这种重复计算,从而提高查询性能。
    • WITH 子句可以被数据库优化器更好地处理。它允许数据库在执行查询时进行更有效的优化,因为每个CTE可以被视为一个独立的表,数据库可以更灵活地选择执行计划。
  3. 模块化和重用性

    • 左边的嵌套子查询没有这种模块化特性,每次需要使用相同的逻辑时都需要重新编写。
    • 右边的查询中,每个CTE都可以视为一个独立的模块,可以在其他查询中重用。例如,S0S1 可以在其他查询中直接引用。
  4. 调试和测试

    • 对于嵌套子查询,调试和测试会更加困难,因为需要同时考虑多个层次的逻辑。
    • 使用 WITH 子句时,可以单独测试每个CTE,确保每个部分的正确性后再组合成完整的查询。
  5. 减少冗余代码

    • 左边的嵌套子查询可能会导致代码冗余,尤其是在需要多次使用相同逻辑时。
    • 右边的查询通过CTE减少了代码的冗余,每个逻辑部分只编写一次。

综上所述,右边使用 WITH 子句的查询在可读性、维护性、性能优化、调试等方面都优于左边的嵌套子查询。

注意

当数据库不支持CTE语法时,该特性自动退回为子查询,如: MySQL5.7

# 明细数据查询支持改写WITH子查询

同上,明细数据查询,数据集预览,计算字段查询调试也同步支持WITH子查询

# 日期维度数据补全: 支持年、月、日、周、季度的日期补全

业务场景:

在业务数据分析中,原始数据常因采集不全或系统问题导致日期断层,例如某电商平台在促销期间部分订单未及时录入,造成日销售数据缺失。若不处理,将导致趋势图出现日期跳跃、从而忽略缺失日期数据,严重影响分析准确性。

功能特点:

此次新增的日期维度补全功能,可以根据用户设定的日期最小时间粒度(年、季度、月、周、日),并生成完整连续的时间序列。系统会将缺失日期自动填充,并对空值进行合理处理(如置零或插值),确保时间轴上无断裂。

# 数据库统一函数增加DECODE函数

DECODE(expression, value, result[, value, result]…[, else])

上面数据集汇总表达式

IF (
   '${metric}'=='count', count(`批次号`),
   IF ('${metric}'=='money', sum(`货值总金额`), sum(`合同/提单量`))
)
1
2
3
4

使用DECODE函数实现如下, 避免了IF函数多重嵌套

DECODE('${metric}', 
    'count', count(`批次号`), 
    'money', sum(`货值总金额`), 
    sum(`合同/提单量`)
)
1
2
3
4
5

# 汇总表达式支持count(*)语法

# 图表

# 重要 类别轴层级显示

本版本在ECharts上用多轴方式实现了类别轴分层显示效果,有效解决了传统单层类别轴因标签过长而导致的显示不全、需旋转或间隔展示等问题。
通过将组合分类按多级结构逐层展开,类别轴得以结构化呈现,大幅缩短单层标签长度,显著提升图表的可读性与美观性。

  • 支持值轴为水平轴场景
  • 支持图表拆分场景
  • 支持时间轴拆分场景
  • 优化类别轴分割线, 仅在父级变化时显示分割线
  • 除了支持柱线图之外,在箱线图、子弹图、热力图、瀑布图也实现了类别轴分层效果
  • 刻度标签自适应, 智能判断刻度标签是否自动旋转或自动截断
    • 当每个分类项具备足够宽度时,系统自动截断文本并显示前几位关键文字,保持标签水平排列;
    • 当项目宽度较窄、密集排列时,则自动切换为倾斜或垂直旋转显示完整刻度。
    • 整个过程无需手动配置,智能平衡空间利用,确保图表在不同布局下均能清晰呈现标签内容。

当然,如果您不喜欢层级化的展示效果,也可以在配置中关闭分层显示,恢复为传统的单层类别轴。

# 重要 维度按表达式排序

维度按表达式排序, 让维度按计算指标汇总排序

支持按表达式对维度进行动态排序,可基于指定的计算指标(如销售额、利润、增长率等)对维度成员进行汇总计算,并按结果自动排序。
该功能突破了维度排序只能基于维度本身排序的限制,实现数据驱动的智能排序,帮助用户快速识别关键类别,提升分析效率与可视化表达的洞察力。

  • 行维度按表达式排序
  • 列维度按表达式排序

# 案例1: 按行汇总排序

在最后一个行维配置自定义排序表达式

父维度有排序设置优先按父维排序

# 案例2:按列汇总排序

在最后一个列维配置自定义排序表达式

# 案例3: 父级行维按指定列指标排序

通过query函数查询排序指标集合,再汇总作为维度排序依据, 下图中对四个父区域排序,依赖其中某一指标列进行了计算排序

const subset = query(
        '利润', // 查询利润指标列
        [
          rowFilters(), // 当前所有的行维信息过滤器,如: `区域`='中南'过滤
          eq('细分', '公司') // 查询`细分`=='公司'
        ]
);
sum(subset); // query返回的数组汇总求和作为区域维度的排序依据
1
2
3
4
5
6
7
8

# 重要 表计算/视图计算增强

  • 函数树描述
  • 增加窗口计算
  • 表达式增加函数
    • windowByColumn, windowByRow、
    • getSubset,
    • last_value, first_value,
    • numFormat, decode

# 重要增加query函数

增加query函数可查询视图中任意条件范围的数据

query(metric, predict, includeHidden = true)
1
  • metric: 指标字段名, metric='指标名.raw' 返回值类型变化之前的原始数据, metric='object'返回对象
  • predict: 过滤条件对象, 使用内置的条件函数构造, and('field', values), 也可以是数组 [eq(..), neq(..)]
  • includeHidden: 是否包含隐藏结果
  • 返回数组
// 样例1: 查找视图中所有 product 等于 desk 且 sales 大于 100 的数据
query('指标名', and(eq('product', 'desk'), gt('sales', 100)))

//样例2: 第二个参数为数组则默认为数组中的条件为and关系
query('指标名', [eq('product', 'desk'), gt('sales', 100)])
1
2
3
4
5
  • 支持返回数据对象
// 查询对象
// lodash 风格数据处理,
// 取数据对象的 '订单日期'字段
// 去重
const data = query('object', colFilters());
return _.chain(data).map('订单日期').uniq().value();
1
2
3
4
5
6
  • query函数在行/列汇总、行/列小计、总计、值类型表达式中全面支持
    • 条件组合: and/or/not
    • 等值: eq/ne
    • 区间: gt/gte/lt/lte/between
    • 字符串比较: like/notLike
    • 动态维度条件: colFilters/rowFilters, 当前单元格维度信息过滤器
  • 支持多种条件嵌套组合查询: and(or(...), and(...), ...)
  • 构造倒排索引(Inverted Index)优化查询性能

# 重要 交叉表之外的图形增加汇总

柱线图, 饼图, 仪表图, 环形进度条, 指标卡 支持汇总计算

# 柱线图汇总

  • 列汇总: 系列中增加一个汇总项
  • 行汇总: 增加汇总系列

# 饼图汇总

  • 行汇总: 有列维时: 增加一个汇总类别饼图

# 环形进度条汇总

  • 行汇总: 有列维时,增加一个汇总类别总进度

# 指标卡汇总

  • 列汇总: 主指标显示为汇总指标
  • 行汇总: 有列维时, 增加一个汇总指标卡

# 饼图汇总

细心的用户可能注意到,图表汇总中饼图增加了行汇总,以新的系列(汇总饼图)显示,为什么饼图没有列汇总?
这是因为列汇总以数据项的形式添加到系列,如果在饼图中新增数据项汇会出现半个饼图扇区显示汇总值的情况,但是为此我们单独增加了饼图汇总功能

# 交叉表

# 指标条件格式交叉比较

  • 条件样式支持指标交叉比较,不仅限于指标自身

# 行维度宽度配置

# 单元格内容支持html

单元格内容支持html, 利用表达式在单元格展示多个汇总指标,并用<br>换行连接

const predict = and(
    colFilters(),
    eq('类别', '技术')
);

const v1 = query('数量', predict);
const v2 = query('销售额', predict);

return ['数量:' + sum(v1), '销售额:' + 
    numFormat(sum(v2), '0.00') ].join('<br>');
1
2
3
4
5
6
7
8
9
10

# 条件格式: 柱线、排行、饼图支持条件格式

# 气泡图

# 矩形分区配置

功能背景:

在数据分析场景中,波士顿矩阵(四象限) 是常用的战略分析工具,用于分类评估业务单元、产品等。
以往,搭建此类分析往往依赖开发者模式,需用到开发者模式编写代码,对普通业务用户不友好。本次对矩形分区配置功能优化,让非技术人员也能轻松构建波士顿矩阵分析。

借助矩形分区配置,可灵活设置 X 轴(如业务增长率)、Y 轴(如市场占有率 )的统计维度(均值、中位数等)、数据映射规则,快速将数据分类到 “问题型、明星型、现金牛型、瘦狗型” 等象限,直观呈现业务布局。

# 数字标签自定义

如下图, 销售额增长率销售额市场占比两个指标都是百分数,并且指标都还比较长,使用自定义数字标签组织重新组织和简化标签格式:

# 柱线图图表标记增强

# 线标记

  • 增加类别轴标线并支持条件设置
  • 统计范围设置: 整体、图、系列
    • 整体: 所有图统一计算标线值
    • : 以拆分的图为单位计算标线值
    • 系列: 每个系列单独计算
  • 统计方法支持分位数
  • 线条样式配置

# 区域标记

值类型支持: 均值、中位数、分位数、常量

# 点标注

  • 标记选定指标
  • 配置Symbol,SymbolSize

# 系列拆分轴

系列拆分之后不再共用类别轴数据, 下图中按区域拆分多图,每个区域中的类别轴都包含所有省, 导致拆分之后的子图失去了分组意义

新的拆分逻辑,根据拆分之后的数据,重新计算类别轴,使得每个拆分区域中仅包含对应区域的省份

# 明细表指标栏支持表头等值筛选

在早期版本中,当需要将明细数据的维度列放置在指标列之后时,必须将维度拖拽到指标栏并置于指标之后。但由于原有逻辑中,指标栏内的列默认为连续型数值,因此不支持等值过滤。

在 v2.3 中,我们优化了过滤逻辑,允许用户对指标栏中的字段执行等值过滤。 这意味着明细表的字段顺序与过滤方式将不再受数据类型限制,既能自由调整列位置,又能灵活进行条件筛选。

# 计量图Gauge仪表样式配置

  • 圆环起始角度
  • 指针 长度/颜色
  • splitLine
  • Anchor样式,边框/背景色/大小

# 区域地图-区域编辑

    1. 一键初始化默认的区域匹配
    1. 拷贝到剪贴板, 为了方便维护,支持把当前区域映射拷贝到剪贴板,然后贴入文本编辑器或Excel编辑
    1. 编辑好的区域映射从剪贴板批量导入

# 热力图

  • 类别轴分层
  • 支持无列维
  • 轴样式配置

# 桑基图数据解析

本版本为桑基图新增多种起始节点数据解析模式,方便应对不同的数据组织结构:

  1. 多个行维组合 → 多个列维组合: 支持从多个行维组合映射到多个列维组合,适合跨维度的流向分析。
  2. 多个行维,每个行维为一层数据: 按行维层级逐层展开,适合分级结构的流向展示。
  3. 两个行维 = 一个行维 + 一个列维: 将两个行维解析为“起点行维 + 终点列维”的模式,适合简单的双节点流向。

# 图表其他

  • 对比图两个值轴样式分开设置
  • 数字格式化支持非强制显示小数配置
  • [优化] 旭日图只有一层时半径过大的问题
  • 值轴刻度值默认缩写

# 大屏

  • 图标组件支持和图表联动事件定义
  • 单选按钮组圆角配置

# 其他

  • 问数知识库支持导入、导出
  • [兼容] 旧版本的chrome和safari兼容,IntersectionObserver
  • [安全] spring 升级5.3.39
  • [安全] springboot 升级到2.5.15
  • [安全] 更新tomcat驱动到9.0.106
  • [安全] 更新H2驱动到2.2.220
  • [安全] 更新MySQL, PostgresSQL, Presto驱动版本

# 修复

  • [修复] 行小计、列小计重复格式化的问题,遇到除以一个数字之后会出现重复除的问题
  • [修复] 交叉表指标样式名以数字开头时不能针对指标设置样式的问题
  • [修复] LOD FIXED把换行替换为空白之后引起的语法错误
  • [修复] 专题分析增加大屏之后,全屏方式导致下拉框弹窗位置不正确的问题
  • [修复] 按时间线拆分之后,单项样式(ItemStyle)配置不起作用的问题
Last update: August 14, 2025 11:28