美文网首页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

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