Filter and Case when

本文探讨了在OBIEE项目实施过程中遇到的问题,即使用Filter和CaseWhen时对数据产生的不同影响。作者详细解释了这两种方法在实际应用中的区别,并通过具体案例说明了如何选择更合适的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值