Filter and Case when

      在项目实施过程中,为了满足报表接口人的需求,我尝试将整个EXCEL表格上的指标都制作出来。这些指标可以利用维度的条件限制进行计算得到。刚开始在利用Filter对几个指标数据进行条件限制没什么问题,比如订单来源这个维度限制为集市,想计算集市的全网退款量。不过随着指标一项项增加,用到的维度条件就不同了。为了计算"小二完结量",我增加了“处理人”这个维度,在表达式里用的也是filter,不过再次查看数据时发现,之前制作的一个指标的数据出现了问题,值变的很小。查看SQL发现在where子句中,将"订单来源"和"处理人"的条件进行了交叉限制。本来这个“小二完结量”在模型里我就用了Filter进行过滤,排除了系统完结。然后在“回复”的“条件”中再次进行filter限制了组别。这样导致在where子句中产生了很多的交叉条件限制。导致数据计算出现了问题。后来我尝试将所有的条件都用case when来写,这样数据就没有问题了。(全表关联当然没有问题了),不过就是速度慢。

 

事后查了下资料,了解了下filter和case when的区别:

 

case when中的条件不会再where子句中,而filter则会将条件限制到where子句中,这样就会减少结果集,从而提升了性能。case when语句相当于全表关联,然后进行筛选,从性能上考虑推荐使用Filter,不过我这种情况,按理说,OBIEE产生的sql是或者的关系,不应该对另外的度量产生影响啊?

 

具体Filter的介绍如下:

FILTER(measure_expr USING boolean_expr)

The following is a simple example of the FILTER function:

SELECT year, 
FILTER(sales USING product = 'coke'),
FILTER(sales USING product = 'pepsi')
FROM logBeverages

After navigation, this query is executed as follows:

SELECT year, 
SUM(CASE WHEN product = 'coke' THEN sales), 
SUM(CASE WHEN product = 'pepsi' THEN sales)
FROM physBeverages
WHERE product = 'coke' OR product = 'pepsi'
GROUP BY year

 FILTER(x USING y),不过Filter的使用要注意的有:

1,y部分必须是一个布尔表达式

2,如果y部分包含度量,则会报错

3,Filter被用于外部查询块则会报错。

4,在X部分不能包含显式的聚集。比如Filter(count(x),y)则是不被允许的。

猜你喜欢

转载自jianchen.iteye.com/blog/792120
今日推荐