基于分析的提示应用又一例(实现复杂的TopN)

考虑下面的需求:

现有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行业

基于分析的提示应用又一例(实现复杂的TopN)_第1张图片

注:我们可以根据需要添加其它的过滤器,比如最常见的时间,以满足我们查看一段时间内Top10的需求。另外,还可以结合表示变量将Top10做成TopN,

以做到随意查看TopN。

 

2、取得Top10的一级行业销售额

新建如下分析

基于分析的提示应用又一例(实现复杂的TopN)_第2张图片

注:最后一列是用来解决union时各部分间排序的

 

对“一级行业”添加如下过滤器

基于分析的提示应用又一例(实现复杂的TopN)_第3张图片

其中,保存的分析就为第1步中新建的分析

 

3、取得排名在10以后的一级行业销售额,并聚合成“其它”

 

取得排名在10以后的一级行业和第2步方法类似,唯一的不同就是需要将关系选择为“不等于任何,如下图所示:

基于分析的提示应用又一例(实现复杂的TopN)_第4张图片

 

至于聚合成其它就很简单的,我们不选择“一级行业”这个字段,而是有一个“其它”的字符串代替就好了。

基于分析的提示应用又一例(实现复杂的TopN)_第5张图片

 

4、将结果union all起来,并排序

 

最后,我们需要把两部分结果union起来,同时将Top10的一级行业按销售额做降序排序,并将“其它”一级行业放在最后;这个时候我们新建的排序字段就能发挥作用了

如下图所示:

基于分析的提示应用又一例(实现复杂的TopN)_第6张图片

 

至此,大功告成!

 

 

完!

 

你可能感兴趣的:(sql)