PowerBI自定义函数
Power BI Desktop 9月份版本已经正式发布。相信很多小伙伴已经关注到了本次版本更新有一个重量级功能的推出自定义函数。那么这个功能对于Power BI的开发者来说很重要么?是否每个人都需要掌握此功能呢?
对此,白茶想说是的,这个功能的推出对于每一位Power BI开发者
来说都是非常重要的。掌握了自定义函数(UDF)
功能,会对日常的BI开发工作产生以下影响:
- 告别重复的KPI逻辑构建
- 形成自己的代码库体系
- 为用户提供开箱即用的DAX体系
- 扩展开发者的职业方向
接下来我们通过具体的函数介绍和实际案例,来向大家介绍UDF
功能。
语法介绍
DAX查询语法如下:
DEFINE/// Optional description above the functionFUNCTION <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>
-
Description:这部分是为函数添加描述的位置,操作与DAX添加备注的方式一致;
-
FunctionName:函数命名,为自定义函数添加名称,后续在DAX中引用均以此名称为主;
-
ParameterName:参数命名,设定参数的名称,以及此自定义函数参数的数量;
-
ParameterType:参数类型/模式,可以设定参数的类型,也可以设定参数的传递模式;
-
参数类型:目前支持的参数类型为
AnyVal
、Scalar
、Table
或AnyRef
,AnyVal代表参数类型为任意,Scalar代表参数是一个标量值,Table代表参数可以是一张表,AnyRef代表参数接受表、列、度量或日期; -
参数子类型:当参数为
Scalar
时,我们可以设定参数的子类型,比如整数、小数、浮点、文本、布尔值等常见的数据类型; -
传递模式:
val
和expr
: -
val:在调用函数之前计算一次,将计算结果传递到函数中,后续计算不会根据上下文变化,类似var(变量);
-
expr:表达式的简称,在函数内部计算时,会
受到上下文变化
的影响,多次引用或参与迭代,则会被多次计算; -
FunctionBody:自定义函数逻辑计算主体,可在此添加函数的相关计算逻辑。
TMDL视图语法如下:
createOrReplace/// Optional description above the functionfunction <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>
除了声明有所区别之外,语法内容基本一致,这里就不做过多的介绍了。
案例
案例数据
创建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 )RETURNROW ("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)
)
使用更改更新模型
结果如下
添加的自定义函数会出现在模型中函数
的选项里面,接下来我们就可以使用已经创建好的自定义函数了。
创建日期表
Dim_Date =
Dim_Date ( 'Sales'[Date] )
结果如下:
创建度量值
模型关系连接完毕后,我们就可以通过之前创建的自定义函数,来构建指标了。
基础度量值
Quantity =
SUM ( Sales[Quantity] )
上期
上期 =
LastMonthValue ( 'DAX'[Quantity] )
同期
同期 =
LastYearValue ( 'DAX'[Quantity] )
结果如下
到这里,自定义函数(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