美文网首页
dax公式优化写法区别1

dax公式优化写法区别1

作者: BI罗 | 来源:发表于2020-07-09 11:52 被阅读0次

    1.values的反作用

    CALCULATE (
            [Actual],
            FILTER (
                'D_Product',
                D_Product[is_newflag] = "Y"
                    || D_Product[is_newflag] = "N"
            )
        )
    
     CALCULATE (
            [Actual],
            FILTER (
                VALUES('D_Product'[is_newflag]),
                D_Product[is_new_initiative_flag] = "Y"
                    || D_Product[is_newflag] = "N"
            )
        )
    

    第一个公式的动作是D_Product表的D_Product[is_newflag]筛选出Y或者N,然后通过product key直接筛选fact表。
    第二个公式是D_Product表与fact表left join后,where D_Product[is_newflag] =Y or N
    所以第一个公式快

    2.switch的写法

    永远不要在switch公式前,var前期定义任何大量计算

    3.时间区间的写法:KEEPFILTERS+DATESBETWEEN与比较运算符

    GIV_Actual_test_keepfilter:=
    VAR d =
        CALCULATE ( MAX ( D_Date[Date] ), ALL ( T_Slicer ), ALL ( 'D_Date' ) )
    
    var t=CALCULATE ( MIN ( D_Product[new_initiative_sos_date] ) )  //sos的日期
    var sosd =DATE(YEAR(t),MONTH(t),1)   //从1号开始,因为month的日期为x年x月1号
    
    return  CALCULATE (SUM ( F_Monthly[spm_no_transit_gross_invoice_value] ),
       
            ALL('T_Slicer'), KEEPFILTERS( DATESBETWEEN(D_Date[Date],sosd,d)
            ))
    
    GIV_Actual_test_>sosd:=
    VAR d =
        CALCULATE ( MAX ( D_Date[Date] ), ALL ( T_Slicer ), ALL ( 'D_Date' ) )
    
    var t=CALCULATE ( MIN ( D_Product[new_initiative_sos_date] ) )  //sos的日期
    var sosd =DATE(YEAR(t),MONTH(t),1)   //从1号开始,因为month的日期为x年x月1号
    
    return  CALCULATE (SUM ( F_Monthly[spm_no_transit_gross_invoice_value] ),
        FILTER (
            ALL ( 'D_Date'[Date] ),
            'D_Date'[Date] >= sosd)
       ,ALL('T_Slicer')
            )
    
    image.png

    第一个公式速度较快,(其实加不加keepfilters的速度没影响,但是为了保持上下文的正确还是加了)
    ALL('T_Slicer')这一步很重要,公式不受页面时间切片影响,第二个公式的大于号计算需要调用FE公式引擎,并且比第一个公式多一个SE查询
    总结:时间区间写法上DATESBETWEEN比 比较运算符快

    4.返回上一层级:treatas与filterr+values+in

    GIV_NI%_of_brand_filter_in:= 
    VAR brand =
        VALUES ( 'D_Product'[brand_name_en] )
    VAR category =
        VALUES ( 'D_Product'[category_name_en] )
    
    
    VAR y =
        CALCULATE (
            [GIV_Actual_test],
            ALL ( D_Product_Type[NI Product hierarchies] ),
            ALL ( D_Product_Type[sub_product] ),
            ALL ( D_Product[product_name_en] ),
            ALL ( D_Product[product_name_cn] ),
            ALL ( D_Product[brand_name_en] ),
            ALL ( D_Product[brand_name_cn] ),
             ALL ( D_Product[category_name_en] ),
            ALL ( D_Product[new_initiative_project_name] ),
            ALL ( D_Product[is_new_initiative_flag] ),
            FILTER(VALUES(D_Product_All[brand_name_en]), D_Product_All[brand_name_en] in brand),
            FILTER(VALUES(D_Product_All[category_name_en]), D_Product_All[category_name_en] in category )
        )
    
    RETURN
      y
    
    GIV_NI%_of_brand_treatas:=
    VAR brand =
        VALUES ( 'D_Product'[brand_name_en] )
    VAR category =
        VALUES ( 'D_Product'[category_name_en] )
    VAR y =
        CALCULATE (
            [GIV_Actual_test],
            ALL ( D_Product_Type[NI Product hierarchies] ),
            ALL ( D_Product_Type[sub_product] ),
            ALL ( D_Product[product_name_en] ),
            ALL ( D_Product[product_name_cn] ),
            ALL ( D_Product[brand_name_en] ),
            ALL ( D_Product[brand_name_cn] ),
             ALL ( D_Product[category_name_en] ),
            ALL ( D_Product[new_initiative_project_name] ),
            ALL ( D_Product[is_new_initiative_flag] ),
            TREATAS ( brand, D_Product_All[brand_name_en] ),
            TREATAS ( category, D_Product_All[category_name_en] )
        )
    return  y 
    

    treatas 还是比较快的

    5.计算非重复值

    Productivity_sku_1:=SUMX(VALUES(F_Sell_In_Out[sfa_code]),1)
    
    Productivity_sku_2:=SUMX(VALUES(D_SaleStore_sfa_code[sfa_code]),1)
    
    Productivity_sku_7:=DISTINCTCOUNT(D_SaleStore_sfa_code[sfa_code])
    

    上面3条公式速度差不多


    Productivity_sku_6:=
    DISTINCTCOUNT(F_Sell_In_Out[sfa_code])
    
    Productivity_sku_5:=
    var t=VALUES(F_Sell_In_Out[sfa_code])
    return
    COUNTROWS(t)
    

    结论:有的时候直接DISTINCTCOUNT事实表比DISTINCTCOUNT一张连接事实表的非重复维表要快,测试过其他发现DISTINCTCOUNT一张连接事实表的非重复维表却更快,所以每次优化还是要看实际情况

    相关文章

      网友评论

          本文标题:dax公式优化写法区别1

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