内联是把函数的源码直接写到调用它的位置,好处是可以消除函数调用时所产生的时间消耗,一般用于需要快速执行的函数
什么是内联
内联(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"}
}
) DataTable ( "Name" , STRING, "Region" , STRING , { { " User1" , "East" } , { " User2" , "East" } , { " User3" , "West" } , { " User4" , "West" } , { " User4" , "East" } } ) 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" }
}
) 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" } } ) 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 是更优雅的写法,参考下面三组公式:
逻辑判断写法 DATATABLE 写法 Table Constructor 写法(推荐) EVALUATE FILTER ( Customer, Customer [ CountryRegion ] = "Italy" || Customer [ CountryRegion ] = "Greece" || Customer [ CountryRegion ] = "Spain" ) 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,
CONTAINS (
DATATABLE (
"CountryRegion", STRING,
{ { "Italy" }, { "Greece" }, { "Spain" } }
),
[CountryRegion],
Customer[CountryRegion]
)
) EVALUATE FILTER ( Customer, Customer [ CountryRegion ] IN { "Italy" , "Greece" , "Spain" } ) EVALUATE
FILTER (
Customer,
Customer[CountryRegion] IN { "Italy", "Greece", "Spain" }
) 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>, … ), … } // 多列 { <scalarExpr1>, <scalarExpr2>, … } // 一列 { ( <scalarExpr1>, <scalarExpr2>, … ) , ( <scalarExpr1>, <scalarExpr2>, … ) , … } // 多列 { <scalarExpr1>, <scalarExpr2>, … } // 一列
{ ( <scalarExpr1>, <scalarExpr2>, … ), ( <scalarExpr1>, <scalarExpr2>, … ), … } // 多列
表构造器在代码中直接定义匿名表 。如果表只有一列,则只需要一个值列表,用大括号包围。加入括号可以分隔多行,当表只有一列的时候,括号可以省略。例如,以下两种定义是等价的:
{ "Red", "Blue", "White" }
{ ( "Red" ), ( "Blue" ), ( "White" ) } { "Red" , "Blue" , "White" } { ( "Red" ) , ( "Blue" ) , ( "White" ) } { "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")
} 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" ) } 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" } EVALUATE { 1 , DATE ( 2017 , 1 , 1 ) , TRUE, "A" } EVALUATE
{ 1, DATE(2017, 1, 1), TRUE, "A" }
早期的 DAX 引擎不支持表构造器,你可以在 Power BI 中编译,但无法在 Excel 2016 或更早的版本的中使用它
不具有数据沿袭
表构造器结果是一个匿名表 ,其中每一列都有一个由使用的行构造函数推断出的数据类型,但是它没有任何与数据库底层列相对应的数据沿袭 。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。
表构造器的妙用
本文隐藏内容查看价格为
1 G币,请先
登录 单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。
说点什么