PowerBI自定义函数

alt

Power BI Desktop 9月份版本已经正式发布。相信很多小伙伴已经关注到了本次版本更新有一个重量级功能的推出自定义函数。那么这个功能对于Power BI的开发者来说很重要么?是否每个人都需要掌握此功能呢?

对此,白茶想说是的,这个功能的推出对于每一位Power BI开发者来说都是非常重要的。掌握了自定义函数(UDF)功能,会对日常的BI开发工作产生以下影响:

  • 告别重复的KPI逻辑构建
  • 形成自己的代码库体系
  • 为用户提供开箱即用的DAX体系
  • 扩展开发者的职业方向

接下来我们通过具体的函数介绍和实际案例,来向大家介绍UDF功能。

语法介绍

DAX查询语法如下:

DEFINE
    /// Optional description above the function
    FUNCTION <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>
  • Description:这部分是为函数添加描述的位置,操作与DAX添加备注的方式一致;

  • FunctionName:函数命名,为自定义函数添加名称,后续在DAX中引用均以此名称为主;

  • ParameterName:参数命名,设定参数的名称,以及此自定义函数参数的数量;

  • ParameterType:参数类型/模式,可以设定参数的类型,也可以设定参数的传递模式;

  • 参数类型:目前支持的参数类型为AnyValScalarTableAnyRef,AnyVal代表参数类型为任意,Scalar代表参数是一个标量值,Table代表参数可以是一张表,AnyRef代表参数接受表、列、度量或日期;

  • 参数子类型:当参数为Scalar时,我们可以设定参数的子类型,比如整数、小数、浮点、文本、布尔值等常见的数据类型;

  • 传递模式:valexpr

  • val:在调用函数之前计算一次,将计算结果传递到函数中,后续计算不会根据上下文变化,类似var(变量);

  • expr:表达式的简称,在函数内部计算时,会受到上下文变化的影响,多次引用或参与迭代,则会被多次计算;

  • FunctionBody:自定义函数逻辑计算主体,可在此添加函数的相关计算逻辑。

TMDL视图语法如下:

createOrReplace
    /// Optional description above the function
    function <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>

除了声明有所区别之外,语法内容基本一致,这里就不做过多的介绍了。

案例

案例数据

alt

创建UDF

DEFINE 
FUNCTION
//创建快捷日期表函数
Dim_Date=
(FactDate:anyref expr)=>
GENERATE (
    CALENDAR ( MIN ( FactDate ), MAX ( FactDate ) ),
    VAR DA = [Date]
    VAR YEAR =
        YEAR ( DA )
    VAR QUARTER =
        "Q" & FORMAT ( DA, "Q" )
    VAR MONTE =
        FORMAT ( DA, "MM" )
    VAR DAY =
        DAY ( DA )
    RETURN
        ROW (
            "Year", YEAR,
            "Quarter", QUARTER,
            "Month", MONTE,
            "DayOfMonth", DAY,
            "YearQuarter", YEAR & QUARTER,
            "YearMonth", YEAR & MONTE,
            "YearMonthCount",
                YEAR * 12 + MONTE
        )
) 
FUNCTION
//创建快捷计算环比上期
LastMonthValue=(SalesVal:numeric expr)=>
CALCULATE (
    SalesVal,
    FILTER (
        ALL ( 'Dim_Date' ),
        'Dim_Date'[YearMonthCount]
            = MAX ( 'Dim_Date'[YearMonthCount] ) - 1
    )
)
FUNCTION
//创建快捷计算去年同期
LastYearValue=(SalesVal:numeric expr)=>
CALCULATE (
    SalesVal,
    FILTER (
        ALL ( 'Dim_Date' ),
        'Dim_Date'[YearMonthCount]
            = MAX ( 'Dim_Date'[YearMonthCount] ) - 12
    )
)

使用更改更新模型

alt

结果如下

alt

添加的自定义函数会出现在模型中函数的选项里面,接下来我们就可以使用已经创建好的自定义函数了。

创建日期表

Dim_Date =
Dim_Date ( 'Sales'[Date] )

结果如下:

alt

创建度量值

模型关系连接完毕后,我们就可以通过之前创建的自定义函数,来构建指标了。

alt

基础度量值

Quantity = 
SUM ( Sales[Quantity] )

上期

上期 =
LastMonthValue ( 'DAX'[Quantity] )

同期

同期 = 
LastYearValue ( 'DAX'[Quantity] )

结果如下

alt

到这里,自定义函数(UDF)功能的介绍就基本结束了,不过值得注意的是,此功能目前还属于预览状态,有诸多限制。

注意

常规:

• 无法在服务中创建或定义DAX UDF

• 无法在模型中隐藏或取消隐藏用户定义函数(UDF)。

• 无法将UDF放入显示文件夹中。

• 功能区中没有“创建函数”按钮。

• 无法将用户自定义函数(UDF)与翻译合并。

• 在没有表格的模型中不支持UDF

定义UDF:

• 不支持递归相互递归

• 不支持函数重载。

• 不支持显式返回类型。

UDF参数:

• 不支持可选参数。

• 不支持参数说明。

• UDF无法返回值enum

• 接受enum值作为其函数参数的内置函数将无法在该上下文中使用UDF

• 未绑定的类型提示expr参数不被计算。

IntelliSense支持:

• 尽管UDF可以在实时连接或复合模型中使用,但没有IntelliSense支持。

• 尽管UDF可用于视觉计算,但视觉计算公式栏没有对UDF的IntelliSense支持。

• TMDL视图对UDF没有适当的IntelliSense支持。

已知Bug:

• 目前已知以下问题,可能会影响功能:

• 重命名这些对象时,不会自动更新对UDF中的表格模型对象(例如度量值、表、列)的引用。

• 如果重命名UDF所依赖的对象,函数正文仍将包含旧名称。 必须手动编辑UDF表达式才能更新对重命名对象的所有引用。

• 涉及UDF的某些高级方案可能会导致分析程序不一致。 例如,当用户将列作为expr参数传递或使用非限定列引用时,可能会看到红色下划线或验证错误。

微软UDF功能介绍[1]

感谢语

因为个人工作原因,白茶大概停更了1年多的时间。这一年的时间里,很多小伙伴通过各种方式联系白茶,询问白茶的状况,感谢各位的关怀和支持。后续白茶会看情况更新的,谢谢大家。

引用链接

[1] 微软UDF功能介绍: https://learn.microsoft.com/zh-cn/dax/best-practices/dax-user-defined-functions#considerations-and-limitations

alt alt

#PowerBI##大数据##可视化##DAX#
Fabric丨白茶 文章被收录于专栏

数据分析进阶之路,带你深入了解可视化技巧。

全部评论

相关推荐

09-04 17:34
四川大学 Java
查看8道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务