让决策更智能
新一代智能数据分析平台

如何实现仅展示前几名,之后排名归类到“其他”

观小远发表于:2020年09月03日 17:54:40更新于:2020年09月03日 18:47:49

需求背景

需要按照维度字段进行聚合计算, 对聚合后数据进行排序,使用柱形图、条形图或者饼图展示时,全部展示的话字段类目多展示不美观,想要仅展示前几名,之后排名全部归类到“其他”里。

原始效果如下图:

0015f50bb3e8d2529a270d71e2a31ad

期望效果:

0015f50b9ecc8b443705f1c6fd017d8

实现方法

主要使用排序函数,有以下 3 种窗口函数(即开窗函数):
0015f50ba13e1b691cbd352226ca86c在 ETL 里和卡片里都可以实现,建议在卡片里做;如果一定要求不并列不重复排名,建议在 ETL 里实现。
卡片
优点:可以随意调整,不受筛选条件限制;
缺点:开窗函数是对聚合前数据排序,是否允许并列排名不好控制。建议使用dense_rank,如使用另两个排序函数rank, row_number 排序结果可能不符合预期。
ETL
优点:可以实现准确不重复排序,防止出现并列排名,想展示前五项,结果展示结果超过五项;
缺点:ETL 聚合后数据量急剧变少,输出数据集只能用于这一个卡片,复用性差;排序结果变成固定字段,不会随着卡片筛选条件变化;不能使用直连数据集。
其他方法:直接在数据集模型里或者 ETL 里写 SQL 语句,直接生成排序结果。需要熟练掌握 相应数据库SQL 写法,此处暂不讨论,可参考以下写法。
0015f50c727c5f6f9e9bf4c50720019

方法步骤

统计各品类 SKU 占比,各品类 SKU 聚合方式为去重计数。想要显示占比最大的前 6 名,剩余品类都显示为其他。

卡片实现方法:

1. 由于卡片内数值字段聚合计算结果不能用于二次计算,需要新建字段用函数来对商品条码进行去重计数。把新建字段拖到“更多工具提示”,聚合方式选无处理,并切换到数据视图进行验证,可看到和系统自带去重计数方式计算结果一致。

注意:去重计数函数count(distict()) 不能开窗,但排序函数都是开窗函数,所以这里去重计数使用 size(collect_set([商品条码])over(partition by [商品分类]))。

0015f50bc12a71b4fab84c03c2dfa5b

0015f50bc650a5419f0e3fabdb0aa5d

2. 新建字段“排名”对上一步去重计数结果进行排序,使用开窗函数dense_rank并进行验证。

0015f50bcb98172c9877ce9d7eee0290015f50bccaa00c71ff62eb9a41e537

3. 新建计算字段来对维度字段“商品分类”重新分组,第 6 名以后归类为“其他”。如果上一步前 6 名内排序有并列排名存在,前 6 名实际上会超过 6 个分类,这里可决定和调整是否仍要显示前 6 名。

0015f50bcf407a1c20c3d4cbcbb5280

0015f50bcf457997ce2031fa5a0f7ea

4. 验证排序和分组无误后,把原维度字段“商品分类”替换成上一步新建的字段“新商品分类”,把字段“排名”拖到排序栏升序排列,“更多工具提示”里的字段可根据需要移除,切换到可视化图表视图,期望效果完成。
0015f50bd188ef3f68a8697568c2c2d
ETL 实现方法:

1. 根据需求对源数据筛选过滤后,添加“分组聚合”节点,把数据聚合到只有每个商品分类只有一条数据的程度。
0015f50c56456e64ba3f31265a26121

2. 新建计算字段进行排序,使用row_number 来进行依次无重复排序。

0015f50c5f40d45e7ddfcca0558ad7a

3. 新建计算字段来对字段“商品”分类进行分组;预览数据无误,保存 ETL 并运行,输出数据集可用来直接制作卡片。

0015f50c62f043869749f28650387da

0015f50c63ba2f3cb3930e220480bcd

注意:以上所用函数为 Spark SQL 函数,适用于非直连数据集,直连数据集只能在卡片里实现,且请使用对应数据库函数。



    您需要登录后才可以回复