从数据到信息
从信息到洞察

创建内联表

内联是把函数的源码直接写到调用它的位置,好处是可以消除函数调用时所产生的时间消耗,一般用于需要快速执行的函数

什么是内联

内联(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>, … ), … }  // 多列

表构造器在代码中直接定义匿名表。如果表只有一列,则只需要一个值列表,用大括号包围。加入括号可以分隔多行,当表只有一列的时候,括号可以省略。例如,以下两种定义是等价的:

{ "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" }
早期的 DAX 引擎不支持表构造器,你可以在 Power BI 中编译,但无法在 Excel 2016 或更早的版本的中使用它

不具有数据沿袭

表构造器结果是一个匿名表,其中每一列都有一个由使用的行构造函数推断出的数据类型,但是它没有任何与数据库底层列相对应的数据沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。

表构造器的妙用

本文隐藏内容查看价格为1G币,请先
单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。

说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数