跳到主要内容
版本:7.0.0

排序函数及应用

功能介绍

      观远BI可视化图表中高级计算集成了“排名”功能,可以指定排序的计算维度、排序方式,以及展示top N,轻松制作自己需要的排名报表。具体介绍请参考 排名计算  。

排名2.png

3种排序类型区别如下:

行列排名:不分组,按行或按列全局排名。

维度组内排名:多维度字段时才可用,按指定维度字段分组后进行组内排名。

维度项排名:按指定维度的聚合结果排名,此时“计算维度”可选维度栏字段或者对比字段。

      但是,有些复杂场景下,需要用排名做筛选,或者用排名信息做二次计算,系统自带的排名功能可能无法满足需求,这种情况下,观远BI也支持使用窗口函数里的排序函数来计算排名。以下介绍常用的排序函数和使用场景。

常用排序函数

      函数                         含义                         开窗示例
rank有并列,有占位。出现相同排名时跳过相同排名,排序结构一般是:1,2,2,4,5,5,7……rank( ) over(partition by [分组字段] order by [排序字段])                             --分组后升序排名
dense_rank有并列,无占位。出现相同排名时不跳过相同排名,排序结构一般是:1,2,2,3,4,4,5……dense_rank( ) over(partition by [分组字段] order by [排序字段] desc)          --分组后降序排名
row_number依次排序,无并列。排序结构是:1,2,3,4,5,6,7……row_number( ) over(partition by 1 order by [排序字段])                               --全局升序排名

案例分享

场景:

      多线图分析时,为了避免因维度过多出现很不易读的“意大利面条图” ,经常会需要对维度做 Top N筛选,以下图为例,横轴为日期维度,按「省份」进行对比,分析各「省份」的「销售金额」的月变化趋势;当「省份」较多时,希望仅显示图表中时间范围内「销售金额」合计排名Top N的「省份」。

排名5.jpg

方案一:

      新建多线图,把需要的字段分别拖入维度、对比、数值栏,此时线条较多较乱。把数值栏用的字段「销售金额」也拖入“更多工具提示”栏,聚合方式默认使用“求和”,点击“高级计算 — 排名”,按照下图设置,确定保存,然后给字段重命名即可。

注意:因为要按照省份的合计值排名,「省份」字段是对比项,所以排序类型要用“维度项排名”。

图片.png

      效果图如下图,光标放上去时,排名信息会显示在浮窗里。

排名1.jpg

方案二:

1. 在卡片里新建2个计算字段:

「省销售额合计」: sum([销售金额])over(partition by [省份])
「排名」:dense_rank()over(partition by 1 order by [省销售额合计] desc)

图片.png

2. 把 「排名」拖入筛选栏,设置范围为“小于等于3”即可。两个方案的最终展示效果基本一致,仅有浮窗和图例显示稍有不同。

排名3.jpg

扩展案例:

按销量排名计算商品小类的累计销量占比 。具体方案请参考  按销量排名计算商品小类的累计销量占比

注意事项

      系统自带的排名功能,是先把数据聚合到最小行数后再排序,所以排序方式可以从 rank、dense_rank,、row_number里按需选择。但是窗口函数相当于在原数据集上排序,并不会把一个分组聚合成一条数据,所以在卡片里仅建议使用函数dense_rank(因为允许并列、无占位)。

      卡片里3个函数开窗计算结果(聚合方式为“无处理”)对比如下图,可以看到,rank、row_number的排名都受数据集原始行数影响,排序结果并不符合预期。如果一定要使用这两种排序逻辑,则建议优先使用系统自带的排名功能,不满足需求的话需要在ETL里先把数据聚合到需要的维度再使用对应的窗口函数计算。

排名4.jpg