内联是把函数的源码直接写到调用它的位置,好处是可以消除函数调用时所产生的时间消耗,一般用于需要快速执行的函数 什么是内联
内联(Inline)是编程语言中的一种常见结构,可以节省每次调用函数带来的额外时间开支,在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡。
普通函数 vs 内联函数 图片来源:网络
DAX 中的内联函数
DAX 并非编程语言,内联函数的数量不多,常用的有 DATATABLE 和 Table Constructor ,用法也比较简单。掌握它们可以让你在某些场景下更加灵活的使用 DAX。
DATATABLE
返回以内联方式创建的表,常用于快速创建结构简单的表。
- DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2..., {{Value1, Value2...}, {ValueN, ValueN+1...}...})
复制代码
DATATABLE 支持的数据类型有:整数,双精度,字符串,布尔值,货币,日期时间。
DATATABLE 的一个主要限制是表的内容必须是常量,不支持任何 DAX 表达式,所以DATATABLE 不是一个常用的函数。不过这种表构造函数语法为开发人员提供了更灵活的表达能力。
你可以以使用 DATATABLE 来生成简单的常数表。在 SQL Server Data Tools (SSDT)的 Analysis Services 表格中,当开发人员将剪贴板的内容粘贴到模型中时,会生成一个使用 DATATABLE 计算的表,而 Power BI 使用 Power Query 来生成常量表,这是 DATATABLE 在 Power BI 中不常用的另一个原因。
- DataTable("Name", STRING,
- "Region", STRING
- ,{
- {" User1","East"},
- {" User2","East"},
- {" User3","West"},
- {" User4","West"},
- {" User4","East"}
- }
- )
复制代码
将以上代码复制到 Power BI Desktop 的新建表,可以看到其结果是一个五行两列的表。
下面的表达式返回一个表,显示了 2019 年季每个度的开始和结束日期。
- Quarters2019 =
- DATATABLE (
- "Quarter", STRING,
- "StartDate", DATETIME,
- "EndDate", DATETIME,
- {
- { "Q1", "2019-01-01", "2019-03-31" },
- { "Q2", "2019-04-01", "2019-06-30" },
- { "Q3", "2019-07-01", "2019-09-30" },
- { "Q4", "2019-10-01", "2019-12-31" }
- }
- )
复制代码
DATATABLE 曾经有一种用法是多值比较,但现在使用 Table Constructor 是更优雅的写法,参考下面三组公式:
- EVALUATE
- FILTER (
- Customer,
- Customer[CountryRegion] = "Italy"
- || Customer[CountryRegion] = "Greece"
- || Customer[CountryRegion] = "Spain"
- )
复制代码- EVALUATE
- FILTER (
- Customer,
- CONTAINS (
- DATATABLE (
- "CountryRegion", STRING,
- { { "Italy" }, { "Greece" }, { "Spain" } }
- ),
- [CountryRegion],
- Customer[CountryRegion]
- )
- )
复制代码- EVALUATE
- FILTER (
- Customer,
- Customer[CountryRegion] IN { "Italy", "Greece", "Spain" }
- )
复制代码 Table Constructor
返回一列或多列组成的表,与 DATATABLE 不同的是,表构造器支持使用返回标量的函数表达式
- { <scalarExpr1>, <scalarExpr2>, … } // 一列
- { ( <scalarExpr1>, <scalarExpr2>, … ), ( <scalarExpr1>, <scalarExpr2>, … ), … } // 多列
复制代码
表构造器在代码中直接定义数据类型的方面,当不同行中列值的数据类型不同时,所有值都转换为公共数据类型,下面的查询返回文本类型的列
- EVALUATE
- { 1, DATE(2017, 1, 1), TRUE, "A" }
复制代码早期的 DAX 引擎不支持表构造器,你可以在 Power BI 中编译,但无法在 Excel 2016 或更早的版本的中使用它 不具有数据沿袭
表构造器结果是一个沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。
表构造器的妙用
在 DAX STUDIO 中调试模型的时候,不能直接调试度量值,因为 DAX Studio 必须使用返回表的查询。此时你可以使用表构造器将度量值转换为表,从而快速调试度量值。- EVALUATE
- SUMX ( SALES, [SalesAmount] ) // 不支持的写法,查询不能返回标量值
- EVALUATE
- {SUMX ( SALES, [SalesAmount] )} //用大括号包围度量值,可以在编译中通过
复制代码
这种写法需要使用较新的 Tabular model,你可以在 Power BI 中使用这种写法,但不支持 Excel 2016 及更老的版本 |