基于分析的提示应用又一例(实现复杂的TopN)
来源:互联网 发布:手机蒙文软件 编辑:程序博客网 时间:2024/05/20 12:24
考虑下面的需求:
现有20个一级行业的销售额,现在要求求出他们的Top10,并且余下的行业合并为“其它”展现出来。
注意:一级行业是由二级行业汇总得到的。
大家注意到这个需求有什么特点没有?那就是2次聚合并计算,第一次聚合是把二级行业汇总到一级行业并排序得到结果集1,
然后在对结果集1中排名不在前10的做第二次聚合,聚合为“其它”
求Top10很简单,直接用BIEE自带的TopN函数就OK了,现在的问题是怎么把10名以后的一级行业聚合起来,用“其它”展现出来。
有人可能会想到我们不应该用TopN,而应该用Rank分两步来实现,第一步是求出前10的,第二步是求出不在前10的。
同样的道理,前10用Rank也很简单,只需要添加一个Rank(销售额)<=10的过滤器就OK了。
对于不在前10的,用Rank(销售额)>10求出。等等,这样你得到的是10条记录(理想没有相同排名情况下),但是你怎么把他变成一条“其它”记录呢?
手工编写逻辑SQL?
很明显,手工编写逻辑SQL理论上是可以实现的,但是有一个问题就是 手工写的逻辑SQL怎么结合过滤器呢?(这个我没有亲自验证过),就算可以结合,但是这仍然不是
一个好方案,所以我们得另避蹊径。
我们换个思维各位看观看行不行,假设我们先把Top10的一级行业列表拿到,然后拿这个列表作为过滤条件,在这之中的就是前10的,不在的就是“其它”的
然后在用union all拼起来,会不会好点?
这方法好像靠谱,怎么实现呢?且听我慢慢道来
不知道大家在使用提示的时候,有没有注意到下面这个选项:
看到了吗?我们可以用其它分析来过滤当前的字段,那么我们前面所需要的列表不就可以新建一个分析来解决么?
1、拿到Top10的一级行业列表
新建如下的分析,指标的公式为:TopN(销售额,10),保存为“TopN行业”
注:我们可以根据需要添加其它的过滤器,比如最常见的时间,以满足我们查看一段时间内Top10的需求。另外,还可以结合表示变量将Top10做成TopN,
以做到随意查看TopN。
2、取得Top10的一级行业销售额
新建如下分析
注:最后一列是用来解决union时各部分间排序的
对“一级行业”添加如下过滤器
其中,保存的分析就为第1步中新建的分析
3、取得排名在10以后的一级行业销售额,并聚合成“其它”
取得排名在10以后的一级行业和第2步方法类似,唯一的不同就是需要将关系选择为“不等于任何,如下图所示:
至于聚合成其它就很简单的,我们不选择“一级行业”这个字段,而是有一个“其它”的字符串代替就好了。
4、将结果union all起来,并排序
最后,我们需要把两部分结果union起来,同时将Top10的一级行业按销售额做降序排序,并将“其它”一级行业放在最后;这个时候我们新建的排序字段就能发挥作用了
如下图所示:
至此,大功告成!
完!
- 基于分析的提示应用又一例(实现复杂的TopN)
- 基于堆结构的TopN问题实现
- BIEE采用基于分析的过滤器实现复杂导航实例
- hive使用rank实现topN的查询
- 透明窗体的又一实现
- 不规则对话框的又一实现
- 透明窗体的又一实现
- 不规则对话框的又一实现
- 透明窗体的又一实现
- 哈希算法的又一简单应用
- Decorator的又一应用(1)
- 基于Java的CORBA技术复杂应用范例
- 又一导航菜单的代码分析
- 基于复杂网络的股票分析论文研读
- 利用TopN算法实现复杂去重实例一则
- 基于web的在线复杂公式编辑器的实现
- 上传图片功能的又一实现
- 又一波str函数的模拟实现
- 面经
- lucene 分页
- HDU 4082 Hou Yi's secret
- org.tigris.subversion.javahl.ClientException Attempted to lock an already-locked dir异常解决方法
- visual studio 2008编译libnids的问题
- 基于分析的提示应用又一例(实现复杂的TopN)
- applescript 按键对应编码
- myeclipse6.5下面安装maven插件及m2eclipse插件
- Diskpart 命令行实用工具介绍
- C语言程序设计实验手册--实验三
- 黑马程序员——反射之Field类 成员变量
- Ubuntu下VirtualBox虚拟机安装XP的设置,USB设备及摄像头的启用
- CheckBoxList 相关操作
- .net使用jquery easyui的datagrid无法显示本地.json文件中的数据