内联是把函数的源码直接写到调用它的位置,好处是可以消除函数调用时所产生的时间消耗,一般用于需要快速执行的函数
什么是内联
内联(Inline)是编程语言中的一种常见结构,可以节省每次调用函数带来的额外时间开支,在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡。
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>, … ), … } // 多列
表构造器在代码中直接定义匿名表。如果表只有一列,则只需要一个值列表,用大括号包围。加入括号可以分隔多行,当表只有一列的时候,括号可以省略。例如,以下两种定义是等价的:
{ "Red", "Blue", "White" } { ( "Red" ), ( "Blue" ), ( "White" ) }
当需要生成多列的时候,需要使用括号作为行分隔符,括号内是每一行的所有列值,括号间是不同的行值。
EVALUATE { (1.5, DATE(2017, 1, 1), CURRENCY(199.99), "A"), (2.5, DATE(2017, 1, 2), CURRENCY(249.99), "B"), (3.5, DATE(2017, 1, 3), CURRENCY(299.99), "C") }
[Value1] | [Value2] | [Value3] | [Value4] |
---|---|---|---|
1.5 | 1/1/2017 | 199.99 | A |
2.5 | 1/2/2017 | 249.99 | B |
3.5 | 1/3/2017 | 299.99 | C |
你可能注意到了,表构造器生成的匿名表使用默认的列名,Value1,Value2,Value3… 以此类推。在数据类型的方面,当不同行中列值的数据类型不同时,所有值都转换为公共数据类型,下面的查询返回文本类型的列
EVALUATE { 1, DATE(2017, 1, 1), TRUE, "A" }
不具有数据沿袭
表构造器结果是一个匿名表,其中每一列都有一个由使用的行构造函数推断出的数据类型,但是它没有任何与数据库底层列相对应的数据沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。
说点什么