排序函数及应用
功能介绍
观远BI可视化图表中高级计算集成了“排名”功能,可以指定排序的计算维度、排序方式,以及展示top N,轻松制作自己需要的排名报表。具体介绍请参考 排名计算 。
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的「省份」。
方案一:
新建多线图,把需要的字段分别拖入维度、对比、数值栏,此时线条较多较乱。把数值栏用的字段「销售金额」也拖入“更多工具提示”栏,聚合方式默认使用“求和”,点击“高级计算 — 排名”,按照下图设置,确定保存,然后给字段重命名即可。
注意:因为要按照省份的合计值排名,「省份」字段是对比项,所以排序类型要用“维度项排名”。
效果图如下图,光标放上去时,排名信息会显示在浮窗里。
方案二:
1. 在卡片里新建2个计算字段:
「省销售额合计」: sum([销售金额])over(partition by [省份])
「排名」:dense_rank()over(partition by 1 order by [省销售额合计] desc)
2. 把 「排名」拖入筛选栏,设置范围为“小于等于3”即可。两个方案的最终展示效果基本一致,仅有浮窗和图例显示稍有不同。
扩展案例:
按销量排名计算商品小类的累计销量占比 。具体方案请参考 按销量排名计算商品小类的累计销量占比 。
注意事项
系统自带的排名功能,是先把数据聚合到最小行数后再排序,所以排序方式可以从 rank、dense_rank,、row_number里按需选择。但是窗口函数相当于在原数据集上排序,并不会把一个分组聚合成一条数据,所以在卡片里仅建议使用函数dense_rank(因为允许并列、无占位)。
卡片里3个函数开窗计算结果(聚合方式为“无处理”)对比如下图,可以看到,rank、row_number的排名都受数据集原始行数影响,排序结果并不符合预期。如果一定要使用这两种排序逻辑,则建议优先使用系统自带的排名功能,不满足需求的话需要在ETL里先把数据聚合到需要的维度再使用对应的窗口函数计算。