DAX中的⾃定义变量函数VAR(1)
VAR是DAX中有⼀个特殊的函数,它的作⽤是将某个函数的结果存储成为⼀个参数,供其他函数使⽤。使⽤VAR函数可以在很⼤程度上简化复杂函数的书写过程,提⾼函数的可读性。同时VAR函数本⾝的输出结果仅仅与其内部使⽤的函数有关,不会受到调⽤它的函数的上下⽂关系所影响,这就使得⽤VAR函数定义的参数具有固定性,可以被当做是普通的计算列类型参数所使⽤。
VAR函数的使⽤⽅法如下:
VAR <name> = <expression>
name处定义变量名,要求格式为:
⽀持英⽂字母和数字组合,但是不能以数字开头。
英语在线发音除了可以使⽤双下划线“__”作为前缀以为,不⽀持使⽤其他的特殊字符,包括空格。
不能跟内置函数名重复;
不能跟已存在的表同名,但是可以跟原始列重名。
expression处填写⽤来⽣成变量值的函数。
VAR函数通常和RETURN关键字⼀起使⽤。RETURN后⾯可以定义⼀组函数表达式,该表达式当中可以将前⾯VAR的结果作为参数使⽤,这样就可以实现将复杂函数进⾏简化书写。
举个例⼦来看VAR函数的使⽤。⼀般在做Project统计时都涉及到指定milestone时间表,例如下图所⽰。
假设在同⼀项⽬中,每⼀个milestone的起始时间都是上⼀个milestone的结束时间。为了获取相同Proj
ectID下紧邻当前milestone最先结束的milestone时间,需要先根据Project ID进⾏分组,然后对组内数据进⾏排序,再之后提取前⼀个milestone的FinishTime。为了实现该需求,我们可以创建⼀个度量值调⽤下⾯表达式,获取当前表中的每个milestone的起始时间。
StartTime =
VAR MilestoneDate =
MAX ( Project[FinishTime] )
VAR ProjectID =
MAX ( Project[ProjectID] )
RETURN
MAXX (
FILTER (
ALL ( Project ),
Project[FinishTIme] < MilestoneDate
&& Project[ProjectID] = ProjectID
),
Project[FinishTime]
)
在这个表达式中,度量值的名称叫做StartTime;⾥⾯有两个VAR函数定义的参数:第⼀个叫MilestoneDate,⼀个叫ProjectID。他们的⽬的是分别获取最⼤的FinishTime和最⼤的ProjectID。
在RETURN部分使⽤了MAXX函数,它可以对表中每⼀⾏的表达式进⾏计算,然后获取结果中的最⼤数值。MAXX⾥⾯调⽤了FILTER函数,他的⽬的是⽣成⼀个⼦表单,然后获取当前字表中的最⼤FinishTime值。 ⽣成⼦表单的条件是针对Project表中所有数据,取当前FinishTime⼩于最⼤FinishTime最⼤值并且ProjectID=ProjectID最⼤值。
咦?这个函数看起来都是取最⼤值的,跟排序没什么关系,那是如何实现需求的呢?秘密就在于当前公式使⽤了度量值作为载体。度量值的特点是它是⼀个聚合函数,并且它会根据⽤户的选择动态的进
⾏聚合计算。当我们⽤这个公式创建下⾯这个表单时,度量值StartTime会根据ProjectID,Milestone以及FinishTime这三个关联的上下⽂进⾏计算。
将第1⾏的ProjectID,Milestone以及FinishTime三个数值待⼊公式可以获得如下结果
函数说明结果
MilestoneDate = MAX ( Project[FinishTime] )受到ProjectID和Milestone这两个上下⽂影响,相当于找ProjectID=1和
Milestone=Milestone A的所有数据,然后获得最⼤的FinishTime值
2/9/2015 (只有当
前⾏数据满⾜条件)nationalbank
ProjectID = MAX ( Project[ProjectID] )同MilestoneDate1
FILTER ( ALL ( Project ), Project[FinishTime] < MilestoneDate && Project[ProjectID] =
ProjectID )
ALL函数返回了整个Project表单,在此基础上需要找到满⾜
Project[FinishTime] < 2/9/2015 && Project[ProjectID] = 1的所有
⾏,来构建⼀个新表
BLANK (没有满⾜浙江省富阳中学
条件的⾏,⽆法构建
表单)
MAXX (FILTER(…), Project[FinishTime])没有满⾜条件的表单BLANK 将第2⾏的ProjectID,Milestone以及FinishTime三个数值待⼊公式可以获得如下结果:
函数说明结果
gay japanMilestoneDate = MAX ( Project[FinishTIme] )
受到ProjectID和Milestone这两个上下⽂影响,相当于找
ProjectID=1和Milestone=Milestone B的所有数据,然后获得
最⼤的FinishTime值
10/22/2015(只有当前⾏数据满⾜条
件)
ProjectID = MAX ( Project[ProjectID] )同MilestoneDate1
charmeFILTER ( ALL ( Project ), Project[FinishTime] < MilestoneDate && Project[ProjectID] = ProjectID )
ALL函数返回了整个Project表单,在此基础上需要找到满⾜
Project[FinishTime] < 10/22/2015 && Project[ProjectID]
= 1的所有⾏,来构建⼀个新表
新表为:
ProjectID=1,Milestone=Milestone
A, FinishTime=2/9/2015(只有这⼀⾏
te
符合条件)
MAXX (FILTER(…), Project[FinishTime])获取新表中最⼤的FinishTime2/9/2015将第3⾏的ProjectID,Milestone以及FinishTime三个数值待⼊公式可以获得如下结果:
函数说明结果
受到ProjectID和Milestone这两个上下⽂影响,相当
MilestoneDate = MAX ( Project[FinishTIme] )于找ProjectID=1和Milestone=Milestone C的所有
数据,然后获得最⼤的FinishTime值
11/12/2015(只有当前⾏数据满⾜条件)
ProjectID = MAX (
Project[ProjectID] )
同MilestoneDate1
FILTER ( ALL ( Project ),
Project[FinishTime] <
MilestoneDate && Project[ProjectID] = ProjectID )ALL函数返回了整个Project表单,在此基础上需要找
到满⾜Project[FinishTime] < 11/12/2015 &&
英语陪同翻译
Project[ProjectID] = 1的所有⾏,来构建⼀个新表
新表有两⾏–第1⾏:
ProjectID=1,Milestone=Milestone A,
ndispensableFinishTime=2/9/2015;第2⾏:
ppt淡雅图片ProjectID=1,Milestone=Milestone B,
FinishTime=10/22/2015
MAXX (FILTER(…), Project[FinishTime])获取新表中最⼤的FinishTime10/22/2015
函数说明结果
以此类推,就可以获得新的所有数据。
关于⾃定义函数VAR的合并拆分,请参考。多的拼音