美文网首页Power plantform
Keepfilter+Filter+All

Keepfilter+Filter+All

作者: BI罗 | 来源:发表于2020-07-23 19:10 被阅读0次

1.keepfilter+filter+all比filter+values速度快

本文的pbix文件

链接:https://pan.baidu.com/s/1paHI01rpguUMxE6pdsjSZw
提取码:xs41

test1_keepfilter = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
                    KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2)))

test3_values = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
                    FILTER(VALUES(Sheet1[name]),[sumofsell]>2))
耗时对比

耗时数据量少,差距不太明显,但是可以看到查询行数的差距

filter+values:因为SE引擎需要FE引擎去计算 [sumofsell]>2,产生了CallbackDataID ,每遇到一个那么都需要在两个引擎件传输数据
keepfilter+filter+all:在Line1,Line2行可以看到FE引擎直接执行了count()和sum(),然后SE引擎执行的xmSQL语句为:

SET DC_KIND="GEC32";
SELECT
'Sheet1'[name], 'Sheet1'[name]
FROM 'Sheet1'
WHERE
    'Sheet1'[name] INB ( 'a', 'c' ) ;

在后来的查询都是SE引擎在工作,所以此公式写法较快
还是那个句话,尽量将工作交给SE引擎,然后查看xmsql语句进行优化,FE公式引擎的绝大部分都是不可读的。

链接-性能优化

2. keepfilter+filter+all并不会清除all参数列上的筛选器

test1 = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
              KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2)))

下面的图a、c为的销量大于2,所以DISTINCTCOUNT为1,b的销量为2,所以为空


更明显一点,用筛选器选了b,显示为空是正确的


筛选器选了a,显示为1


3. keepfilter+filter+all不会清除外层函数的上下文

test2 = CALCULATE(CALCULATE(DISTINCTCOUNT(Sheet1[name]),
                    KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2))),'Sheet1'[name]="a")

外层函数限定了a,所以全部是1


当然筛选器选了b,结果也是1


结论:

keepfilter+filter+all的效果等于filter+values,但是一般而言比后者快(具体情况还是需要用daxstudio实测),all函数因为keepfilter函数所以可以受筛选上下文的影响,实质就是将filter内的筛选条件加入到当前整个函数的筛选上下文。
keepfilter+filter+all还有一个好处还在于可以all多个列, ALL( 列1, 列2)

相关文章

  • Keepfilter+Filter+All

    1.keepfilter+filter+all比filter+values速度快 本文的pbix文件 链接:htt...

网友评论

    本文标题:Keepfilter+Filter+All

    本文链接:https://www.haomeiwen.com/subject/yiahlktx.html