PowerBI开发 第十四篇:DAX 表达式(时间+过滤+关系)

DAX表达式中包含时间关系(Time Intelligence)相关的函数,用于对日期维度进行累加、同比和环比等分析。PowerBI能够创建关系,通过过滤器来对影响计算的上下文。

一,时间关系

DAX表达式有两种方式计算累加和,TOTALxTD()是DATESxTD()的语法糖,使得PowerBI对累加和的计算更加简单。

所有的时间关系函数都包含一个特殊的dates参数,该参数有三种形式:

  • 对date/time列的引用,格式是DateTable[Date_Column]
  • 表格表达式,返回日期/时间类型的单列表
  • 布尔表达式,用于定义日期/时间值的单列表。

为了应用时间关系,按照时间对数据分析,最好单独创建一个日期维度表,并和事实表创建 1 : N  的关联,确保关系是活跃的。日期维度的粒度设置为Day,确保日期维度表包括所有的日期数据。

1,直接计算累加和

DAX中有三个函数直接用于计算累加和,TOTALMTD是按当前月计算累加和、TOTALQTD是按当前季度计算累加和、TOTALYTD是按当前年份计算累加和:

TOTALMTD(<expression>,<dates>[,<filter>])
TOTALQTD(<expression>,<dates>[,<filter>])
TOTALYTD(<expression>,<dates>[,<filter>][,<year_end_date>])  

参数 expression是聚合标量值的表达式,dates是包含日期的字段,filter是过滤器,返回的是布尔值。

例如,计算当前的销售额:

= TOTALMTD(SUM(InternetSales[SalesAmount]),DateTime[DateKey])  

2,返回xTD得所有日期

返回到当前的所有日期,参数dates是只包含一个日期列的表格,函数从dates中取第一个日期作为基准:

DATESMTD(<dates>)
DATESQTD(<dates>)
DATESYTD(<dates> [,<year_end_date>]) 

DATESMTD()函数适用于日期维度,该日期维度必须具有连续的非重复日期,从指定数据的第一年的1月1日到去年12月31日,该函数返回一个单列表,该表由上下文中当前日期的月份的第一个月与上下文中的当前日期之间的日期组成。

=CALCULATE(SUM(InternetSales[SalesAmount]), DATESMTD(DateTime[DateKey]))  

3,计算同比(前一个年份的同期)

函数PARALLELPERIOD用于计算平行时期,平行日期是指在参数dates上向前或向后移动多个时间间隔(intervals),该函数返回一个包含平行日期的表,使用该函数可以用于计算同比:

PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)

参数注释:

  • dates 指定当前的日期
  • interval 指定时间间隔,有效值是 year、quarter和month
  • number_of_intervals 指定向前或向后移动的时间间隔

此函数获取由dates指定的列中的当前日期集,将第一个日期和最后一个日期移动指定的间隔数,然后返回两个移位日期之间的所有连续日期。 如果间隔是月,季度或年的部分范围,则结果中的任何部分月份也将填写以完成整个间隔。

例如,向前回滚12个月,把DateTime[DateKey]中的最小日期和最大日期移动指定的间隔数,然后返回两个移位日期之间的所有连续日期,计算这些日期对应的销量(Sales_Amount)。

CALCULATE([Sales_Amount]*1.1,PARALLELPERIOD(DateTime[DateKey],-12,MONTH))

在该示例中,CALCULATE的第二个参数是一个表格。

另一个函数是SAMEPERIODLASTYEAR(),它是PARALLELPERIOD(DateTime[DateKey],-12,MONTH) 的包装器:

SAMEPERIODLASTYEAR(<dates>)

4,计算环比(前一天/月/季/年)

函数 PREVIOUS+(DAY/MONTH/QUARTER/YEAR),是把指定的日期向前移动的函数,参数是一个包含日期的数据表,返回的是一个包含日期的数据表。

PREVIOUSDAY(<dates>)
PREVIOUSMONTH(<dates>)
PREVIOUSQUARTER(<dates>)
PREVIOUSYEAR(<dates>[,<year_end_date>])  

对于PREVIOUSMONTH()函数,该函数使用dates(输入参数)中的第一个日期作为基准,返回该日期上个月的所有日期。 例如,如果dates参数中的第一个日期指的是2009年6月10日,则此函数将返回2009年5月的所有日期。

=CALCULATE(SUM(InternetSales[SalesAmount]), PREVIOUSMONTH(Date[DateKey]))  

二,过滤相关

过滤相关的函数,这些函数跟PowerBI上过滤器图表(Slicer)。

1,过滤器选中的值(唯一值)

过滤器当前选中的值,可以通过函数来获取:

SELECTEDVALUE(<columnName>[, <alternateResult>]) 

参数注释:

  • columnName :是已存的一个列名,不能是表达式,当columnName的上下文仅被过滤为一个不同的值时,该函数返回该值;
  • alternateResult:可选项,默认值是BLANK();如果columnName的上下文被过滤到0个或多个唯一值时,返回alternateResult;

当过滤器只被选中一个值时,该函数会返回选中的值。

2,过滤器选中的值(多值)

函数VALUES()返回一个单列的表,该列由参数ColumnName指定,该表包含该列的所有唯一值。

VALUES(<ColumnName>)  

该函数受到过滤器的影响,在已过滤的上下文中使用VALUES函数时,VALUES返回的唯一值会受到过滤器的影响。 例如,如果按Region过滤,并返回City的列表,则VALUES()函数仅包括过滤器允许的区域中的那些城市。

=COUNTROWS(VALUES(InternetSales[SalesOrderNumber]))  

Values函数和Distinct函数很相似,唯一不同的是Values函数会返回Unknown,这是因为关联的Table中包含不匹配的数据行,和Left Join的右表中包含NULL值很相似。

结合CONCATENATEX函数,能够把所有过滤器的唯一值连接成字符串。注意,DAX表达式使用 & 进行字符串的连接。

三,关系

表与表之间,可以创建多个关系,但是,只有一个关系是活跃的,该关系是默认的关系。默认情况下,度量表达式都会使用默认的关系应用过滤器,进行交互计算。

USERELATIONSHIP(<columnName1>,<columnName2>) 

USERELATIONSHIP使用模型中的现有关系,通过其端点列来标识关系,该函数用于指定要在特定计算中使用的关系。在USERELATIONSHIP中,关系的状态并不重要,也就是说,关系是否处于活动状态不会影响该功能的使用。 即使关系处于非活动状态,它也将被使用并覆盖模型中可能存在但在函数参数中未提及的任何其他活动关系。

USERELATIONSHIP 函数不返回任何值,仅在计算期间启用指定的关系,并且仅用于把filter作为参数的函数中,例如,CALCULATE、CALCULATETABLE、CLOSINGBALANCEMONTH、CLOSINGBALANCEQUARTER、CLOSINGBALANCEYEAR、TOTALMTD, TOTALQTD 和 TOTALYTD。

参考文档:

DAX Reference

DAX Time Intelligence Functions

原文地址:https://www.cnblogs.com/ljhdo/p/5158596.html

时间: 2024-08-14 21:28:59

PowerBI开发 第十四篇:DAX 表达式(时间+过滤+关系)的相关文章

Android UI开发第二十四篇——Action Bar

Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观.你能够用ActionBar的对象的API来控制操作栏的行为和可见性,这些API被添加在Android3.0(API 级别 11)中. Action bar的主要目的是: 1.  提供一个用于识别应用

第十四篇 Integration Services:项目转换

本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业智能工具(SSDT-BI)或Visual Studio 2012将我们的第一个SSIS项目转换为SSIS 2012.为什么你想升级我们的SSIS项目到2012?你可能想使用SSIS 2012中的新特性.你可能还希望利用SSIS 2012目录.要使用目录,你的项目必须遵循项目部署模型,我们也将在这篇文

从零开始学ios开发(十四):Navigation Controllers and Table Views(上)

这一篇我们将学习一个新的控件Navigation Controller,很多时候Navigation Controller是和Table View紧密结合在一起的,因此在学习Navigation Controller的同时,我们还将继续学习Table View其他一些特性,毕竟Navigation Controller还是相对来说毕竟简单的,没有什么太大的花头,它的主要作用就是一个view的切换,切来切去,而Table View的花头就比较多了,这次我们将这2个控件结合在一起进行学习. 再多说一

第十四篇 现象

第十四篇  现象 "现象"的产生是由宇宙当中各种因素交汇的结果.现象是万物在宇宙中的展现,它可以被人为创造,也可以由宇宙规律自行产生.现象能帮助人类逐步地了解宇宙的本质,也能帮助人类更好地了解自己. 当一个生命对宇宙有足够高度的认识之后就会留意所有的现象,并从这些现象当中去探索自身以及宇宙的奥秘.可以说,生命的成长过程就是不断地分析与探索各种现象,从而总结经验,让自身不断提高探索宇宙奥秘能力的一个历练过程. 随着对各种现象的不断分析与探索,人类会越来越深刻地认识到现象背后的本质,而不会

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

NHibernate 存储过程 第十四篇

NHibernate 存储过程 第十四篇 NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DELETE FROM Person WHERE PersonId = @Id; 修改映射文件,添加删除对象的存储过程: <?xml version="1.0" encoding="utf-8" ?> <hiber

解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

原文:解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) 解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究vardecimals 是怎麽存储在磁盘上的. 作为一般的介绍vardecimals 是怎样的,什么时候应该使用,怎样使用,参考这篇文章 vardecimal 存储格式启用了吗? 首先,我们需要看一下vardecim

嵌入式Linux裸机开发(十四)——ADC

嵌入式Linux裸机开发(十四)--ADC 一.AD转换简介 AD转换就是模数转换,就是把模拟信号转换成数字信号.A/D转换器是用来通过一定的电路将模拟量转变为数字量.模拟量可以是电压.电流等电信号,也可以是压力.温度.湿度.位移.声音等非电信号.在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号.A/D转换后,输出的数字信号可以有8位.10位.12位.14位和16位等. 二.ADC控制器 ADC控制器时钟: 时钟源为PCLK_PSYS,经过一次分频后得到AD

S3C2416裸机开发系列十四_GCC下UCGUI的移植(2)

S3C2416裸机开发系列十四 GCC下UCGUI的移植(2) 象棋小子    1048272975 现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置. 笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节" GCC启动代码工程应用实例".下面主要介绍UCGUI目录下很多的源码文件Makefile的编写,一种可行的方式就是把GUI目录上所有的c文件,不管有无用到,均加入工程