在项目实施过程中,为了满足报表接口人的需求,我尝试将整个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)则是不被允许的。