1 概述
在图表组件中,若对多个字段都设置排序,且这些字段的排序会影响同一区域范围内的数据时,便会产生排序优先级的概念,本文主要介绍各场景下多字段都设置排序的生效逻辑。
关于 排序设置及操作入口 的具体说明详见:新数据排序逻辑,本文不再详细介绍。
2 全局和组内的影响范围
我们先来了解下 单个字段 上设置全局排序和组内排序的影响效果,有助于理解后面多字段排序混合使用的场景。
2.1 组内排序
组内排序指对最小的分组维内数据进行排序。由于排序范围前提是要先有分组,所以当某个字段设置了组内排序后,会影响其分组字段的顺序,表示按照什么顺序进行分组。
1、若在 度量字段 上设置组内排序,则此度量分组路径上未排序的维度字段都按此度量排序。
比如下图想要按 销售量组内升序,看哪些地区、哪些年份销售量少。在销售量字段上设置组内升序,销售量的分组包含维度含发货区域、省份和年份,所以实际排序过程如下:
- 发货区域 字段本身先按 销售量 的值进行组内升序排序,下图红色框内数值代表对应发货区域的销售量,展示的结果是按照销售量从小到大顺序展示。
- 省份 字段再按 销售量 的值进行组内升序排序,下图黄色框内数值代表在华南区域下,各省份的销售量,展示的结果是按照销售量从小到大顺序展示。
- 年份 字段最后按 销售量 的值进行组内升序排序,下图蓝色框内数值代表各省份不同年份的销售量,展示的结果是按照销售量从小到大顺序展示。
图中的小计行、颜色框都是用于直观对比排序结果,不显示小计合计时,也是会按上面所描述的逻辑展示各维成员的顺序。
2、若在维度字段上设置组内排序,则其前面未排序的维度字段都按当前字段值排序,且采用设置排序的维度字段的升降序设置。
比如下图想要按 年份组内降序,看各区域和省份的销售情况。在年份字段上设置组内降序,年份的分组包含维度含发货区域和省份,所以实际排序过程如下:
- 发货区域 字段本身先按 自身的值 进行组内降序排序,下图红色框内是发货区域自身组内降序排序结果。
- 省份 字段再按 自身的值 进行组内降序排序,下图黄色框内是在西南区域下,省份自身组内降序排序结果。
- 年份 字段最后按 自身的值 进行组内降序排序,下图蓝色框内是某个省份下,年份自身组内降序排序结果。
基于字符串字段排序时,是按照字符集顺序排,不同的数据库类型的字符集排序结果可能会不一样。
3、为了能更全面地了解什么是组内排序,下面举一个特殊场景的例子来说明。
如下图所示,当前希望按 销售额同比增长率 组内降序排序,看各个发货区域的销售情况。此时在 同比增长率字段上设置组内降序排序,实际的排序过程如下:
- 发货区域 字段本身先按 同比增长率 的值进行组内降序排序。
- 年月 字段再按 同比增长率 的值进行组内降序排序。
排序结果如下图所示:
上图的排序结果,并没有如用户预期想要的,华南的2021年03月的同比增长率最大,应该排在最前面。我们来看看为什么会产生这样的排序结果,原因如下:
- 针对整个表格组件,同比增长率计算的时间层次是依赖于表格上的年月字段,当前场景下虽然筛选器也包含了年月时间层次,但由于时间粒度相同,最终同比增长率计算表达式是固定取表格上的年月字段。
- 时间计算 同比增长率 ,如果不带时间层次查询,计算结果全是 null。
- 当在 同比增长率 上设置了组内排序时,发货区域本身需要按照它的同比增长率进行排序,由于计算结果都是 null ,所以所有的发货区域都是按照null值进行排序,可以通过后台的管理界面上查看查询结果,如下图所示。
2.2 全局排序
全局排序指不受当前分组结构限制,排序结果影响整个所有数据。不同于组内排序,全局排序是只排当前字段,其他字段不会有额外的排序设置影响,直接按从数据层返回的顺序展示。
比如下图想要按 产品类别全局升序,看各区域不同年份的销售情况。在产品类别字段上设置全局升序,此时产品类别先按照从小到大进行排序,然后其他字段按照数据层返回结果展示。
3 多字段排序优先级
3.1 影响的行列区域范围
我们先来了解下不同排序位置的影响范围有哪些,当对多个字段都设置排序,且这些字段的排序会影响同一区域范围内的数据时,便会有排序优先级。
1、明细表和汇总表,在字段上设置的排序都是影响行上的数据顺序。
2、交叉表和树状表维度字段的排序
- 红框内行区上的维度字段排序,影响行上的数据顺序
- 黄框内列区上的维度字段排序,影响列上的数据顺序
3、交叉表和树状表维成员或度量名称上的排序
- 交叉表和树状表数据面板的度量区的字段上无排序入口,因为这两个组件需 维成员+度量字段 才能组合唯一的一行或一列,所以排序入口只支持表头排序,且表头路径上必须含度量字段。
- 且不管行区还是列区,只有在叶子节点上才有排序入口,其他层级无排序入口,下图以度量名称放在列区为例:
- 度量名称放在行列不同区域,影响范围不同,但排序逻辑是一样的。
(1)当度量名称放在列区时,影响行上的数据顺序。
(2)当度量名称放在行区时,影响列上的数据顺序(2025年05月及以后的V11版本,树状表才支持将度量名称放在行区)。
3.2 优先级生效原则
多个字段都设置了排序,如果这些字段影响的是同一片区域数据时:
1、针对独立的维度、度量字段,系统默认以表格字段的顺序为排序优先级,越靠前排序优先级越高。
对于交叉表和树状表,当维度和度量排序影响同一片区域数据时,表格字段顺序默认是 行区>度量区、列区>度量区。
2、如果是相同度量字段,但度量路径不同时,以设置排序的先后为优先级,先设置的排序优先级高于后设置的排序。当设置了多字段排序时,可以通过 查看排序优先级 面板查看排序优先级。
下图为例,先后在以下位置设置了排序:点心-2017年-销售额、谷类/麦片-2016年-销售量、调味品-2016-销售量,实际的排序过程是:
- 数据面板的度量区中,销售量在销售额前面,所以销售量上设置的排序会优先于销售额。
- 对于都是销售量上设置的排序,则会根据设置排序的先后顺序决定优先级,所以 谷类/麦片-2016年-销售量 > 调味品-2016-销售量。
详细的多字段排序场景,在下面3.4章节中介绍。
3.3 多字段排序逻辑
在本文章节2中,我们已经了解了全局排序和组内排序的逻辑,在此基础上,对于多字段排序逻辑只要抓住下面三个关键的核心即可:
(1)组内是前面分组路径上的维度都要排;全局是只排当前字段。
(2)如果有重复的排序字段设置,则剔除后面重复的排序字段设置,主要为了优化性能。
(3)数据模型层为了保证每次数据返回结果一样,返回数据时默认给所有维度按升序排,这是一个优先级最低的排序。
比如按从左到右的顺序查询字段 a b c d e 5个维度字段,在报表上给 b 和 d 设置了排序,则:
当 b 是 全局排序 、d 是 全局排序 时,order by b d a c e
当 b 是 全局排序 、d 是 组内排序 时,order by b a
bc d e当 b 是 组内排序 、d 是 组内排序 时,order by a b
a bc d e当 b 是 组内排序 、d 是 全局排序 时,order by a b d c e
画删除线代表此为重复的排序字段设置,为性能考虑需剔除它。
当两次排序的排序字段和排序依据都相同时,则被认为是重复的排序字段设置。
3.4 多字段排序场景示例
1、维度+度量排序场景:在查看各月份的销售数据时,希望先按照月份从大到小降序排序,再看各月份中哪些发货区域的调味品销售额最好。
在年月上设置组内降序,再在调味品-销售额上设置组内降序,即可得到期望效果,实际的排序过程是:
(1)优先级判断:年月和调味品-销售额的排序都影响行上的顺序,年月字段位置在销售额前面,所以 年月的排序优先级 高于 调味品-销售额的排序。
(2)年月 排序设置先生效 :
- 年份 属于 年月 分组路径上未设置排序的维度字段,所以 年份 按照自身的值组内降序先排,接着 年月 按照自身的值再组内降序。
(3)调味品-销售额 排序设置后生效:
- 年份、年月、发货区域 都属于 调味品-销售额 分组路径上的维度字段,但由于 年份、年月 已按照优先级更高的排序设置排完了,所以此时只有 发货区域 按照调味品-销售额的值组内降序排序。
2、度量+度量排序场景:看哪些发货区域订单量少但销售额高。
在调味品-订单量上设置组内升序,再在调味品-销售额上设置组内降序,即可得到期望效果,,实际的排序过程是:
(1)优先级判断:订单量和销售额的排序都影响行上的顺序,订单量字段位置在销售额前面,所以 调味品-订单量的排序优先级 高于 调味品-销售额的排序。
(2)调味品-订单量 排序设置先生效 :
- 年份、年月、发货区域 都属于 调味品-订单量 分组路径上未设置排序的维度字段,所以 年份、年月、发货区域 都先后分别按照调味品-订单量的值组内升序排序。
(3)调味品-销售额 排序设置后生效:
- 年份、年月、发货区域 都属于 调味品-销售额 分组路径上的维度字段,但由于 年份、年月、发货区域 已按照优先级更高的排序设置排完了,此时调味品-销售额的排序设置只会影响到同个分组内订单量相同的数据的顺序。
3、全局+全局排序场景:
在分析销售数据时,希望先按照产品类别全局升序排序,再按销售量全局降序排序。
在产品类别上设置全局升序,在销售量上设置全局降序,即可得到期望效果,实际的排序过程是:
(1)优先级判断:产品类别和销售量的排序都影响行上的顺序,产品类别字段位置在销售量前面,所以 产品类别的排序优先级 高于 销售量的排序。
(2)产品类别 排序设置先生效 :
- 产品类别 按照自身的值 全局升序 排序。
(3)销售量 排序设置后生效:
- 由于产品类别已排序,需要固定产品类别的顺序,再按照 销售量 全局降序 排序。
4、全局+组内排序场景:
在分析销售数据时,希望先按照产品类别全局升序排序,再按销售量组内降序排序。
在产品类别上设置全局升序,在销售量上设置组内降序,即可得到期望效果,实际的排序过程是:
(1)优先级判断:产品类别和销售量的排序都影响行上的顺序,产品类别字段位置在销售量前面,所以 产品类别的排序优先级 高于 销售量的排序。
(2)产品类别 排序设置先生效 :
- 产品类别 按照自身的值 全局升序 排序。
(3)销售量 排序设置后生效:
- 由于产品类别已排序,需要固定产品类别的顺序,再按照 销售量 组内降序 排序,按照组内排序的逻辑,发货区域、年份 分别按照销售量的值组内降序排序。